Knex: Fehler „Modul nicht gefunden“ bei Verwendung von Knex mit Webpack

Erstellt am 6. Jan. 2016  ·  23Kommentare  ·  Quelle: knex/knex

Ich versuche, Knex in einem Projekt zu verwenden, an dem ich arbeite. Das Problem, das ich habe, ist, dass, wenn ich versuche, Webpack auszuführen, die Anforderungen verfolgt und versucht werden, Treiber/Dialekte einzufügen, die ich nicht verwende und die ich nicht installiert habe.

Irgendwelche Gedanken, wie das gelöst werden kann?

`````` Protokoll
FEHLER in ./~/mariasql/lib/Client.js
Modul nicht gefunden: Fehler: „Datei“ oder „Verzeichnis“ ../build/Debug/sqlclient in ~/project/node_modules/mariasql/lib kann nicht aufgelöst werden
@ ./~/mariasql/lib/Client.js 17:10-45

FEHLER in ./~/knex/lib/dialects/sqlite3/index.js
Modul nicht gefunden: Fehler: Modul „sqlite3“ in ~/project/node_modules/knex/lib/dialects/sqlite3 kann nicht aufgelöst werden
@ ./~/knex/lib/dialects/sqlite3/index.js 33:11-29

FEHLER in ./~/knex/lib/dialects/mysql2/index.js
Modul nicht gefunden: Fehler: Modul „mysql2“ in ~/project/node_modules/knex/lib/dialects/mysql2 kann nicht aufgelöst werden
@ ./~/knex/lib/dialects/mysql2/index.js 33:11-28

FEHLER in ./~/knex/lib/dialects/mysql/index.js
Modul nicht gefunden: Fehler: Modul „mysql“ kann in ~/project/node_modules/knex/lib/dialects/mysql nicht aufgelöst werden
@ ./~/knex/lib/dialects/mysql/index.js 35:11-27

FEHLER in ./~/knex/lib/dialects/oracle/index.js
Modul nicht gefunden: Fehler: Modul „oracle“ kann in ~/project/node_modules/knex/lib/dialects/oracle nicht aufgelöst werden
@ ./~/knex/lib/dialects/oracle/index.js 40:11-28

FEHLER in ./~/knex/lib/dialects/postgres/index.js
Modul nicht gefunden: Fehler: Modul „pg“ kann in ~/project/node_modules/knex/lib/dialects/postgres nicht aufgelöst werden
@ ./~/knex/lib/dialects/postgres/index.js 46:11-24

FEHLER in ./~/knex/lib/dialects/postgres/index.js
Modul nicht gefunden: Fehler: Modul „pg-query-stream“ in ~/project/node_modules/knex/lib/dialects/postgres kann nicht aufgelöst werden
@ ./~/knex/lib/dialects/postgres/index.js 132:50-76

FEHLER in ./~/knex/lib/dialects/strong-oracle/index.js
Modul nicht gefunden: Fehler: Modul „strong-oracle“ in ~/project/node_modules/knex/lib/dialects/strong-oracle kann nicht aufgelöst werden
@ ./~/knex/lib/dialects/strong-oracle/index.js 15:9-33```
``````

Hilfreichster Kommentar

ist auch darauf reingefallen. was für mich funktioniert;

externals: {
  knex: 'commonjs knex'
}

Alle 23 Kommentare

Ich hatte dieses Problem, aber das Hinzufügen einer Regex zu meinen Externals in meiner Webpack-Konfiguration hat es behoben:

const commonLoaders = [
  { test: /\.js$/, loader: 'babel', exclude: [/node_modules/] },
  { test: /\.json$/, loader: 'json' },
];

module.exports = [
  {
    name: 'browser',
    entry: './js/entry.js',
    output: {
      path: './build',
      filename: 'bundle.js',
    },
    module: {
      loaders: commonLoaders.concat([
        { test: /\.styl$/, loader: 'style!css!stylus' },
      ]),
    },
  },
  {
    name: 'server',
    entry: './server.js',
    target: 'node',
    output: {
      path: './build',
      filename: 'server.js',
      libraryTarget: 'commonjs2',
    },
    externals: [
      {
        'socket.io': 'socket.io',
      },
      /^[a-z\-0-9]+$/,
    ],
    module: {
      loaders: commonLoaders.concat([
        { test: /\.styl$/, loader: 'css!stylus' },
      ]),
    },
  },
];

+1

@joeketchi Das Ignorieren des Verzeichnisses node_modules löst das Problem nicht wirklich, wir umgehen das Problem nur. Es wäre großartig, wenn der Code diese Anforderungen auf intelligentere Weise ausführen würde, die keine Fehler auslöst.

Auch darauf gestoßen. Nicht ganz sicher, warum das Ignorieren von node_modules nicht funktioniert.

ist auch darauf reingefallen. was für mich funktioniert;

externals: {
  knex: 'commonjs knex'
}

Ich kann das Mariasql-Problem nicht speziell kommentieren, aber was mein Problem gelöst hat, ist, alle Treiber, die ich nicht verwende, als extern zu definieren. Zum Beispiel verwende ich den mysql2-Treiber für mein Projekt, also habe ich dies in Externals:

  externals: {
    // Possible drivers for knex - we'll ignore them
    'sqlite3': 'sqlite3',
    'mariasql': 'mariasql',
    'mssql': 'mssql',
    'mysql': 'mysql',
    'oracle': 'oracle',
    'strong-oracle': 'strong-oracle',
    'oracledb': 'oracledb',
    'pg': 'pg',
    'pg-query-stream': 'pg-query-stream'
  }

Das Ergebnis ist, dass knex ohne Fehler oder Warnungen gebündelt wird

Dieses Problem scheint nur ein Problem zu sein, wie man die Webpack-Konfiguration einrichtet, wenn Knex enthalten ist ... lassen Sie uns erneut öffnen, wenn in Knex Änderungen erforderlich sind, um Webpack besser zu unterstützen.

Eigentlich denke ich, dass das Thema noch nicht geschlossen werden sollte, es gibt noch ungelöste Probleme mit Webpack, mit Migration und Seed:

WARNING in ./node_modules/knex/lib/migrate/index.js
342:20-81 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/migrate/index.js
447:18-49 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/seed/index.js
113:13-74 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/seed/index.js
150:11-24 Critical dependency: the request of a dependency is an expression

Ich konnte diese nicht reparieren

@ifullgaz das scheint kein Fehler zu sein, sondern nur eine Warnung, dass require() nicht mit String-Literal verwendet wurde? https://github.com/webpack/webpack/issues/196

@ifullgaz , ich habe Ihre Lösung ausprobiert, aber ich habe die folgenden Fehler erhalten. Sind Sie auf ein ähnliches Problem gestoßen?

  Error --------------------------------------------------
  Command failed: npm install
gyp ERR! UNCAUGHT EXCEPTION
gyp ERR! stack Error: spawn EACCES
gyp ERR! stack     at exports._errnoException (util.js:1018:11)
gyp ERR! stack     at ChildProcess.spawn (internal/child_process.js:319:11)
gyp ERR! stack     at exports.spawn (child_process.js:378:9)
gyp ERR! stack     at exports.execFile (child_process.js:143:15)

@brianhuangyl haben Sie den korrekten Besitz usw. des node_modules-Verzeichnisses und seines gesamten Inhalts (Sie haben npm install zu keinem Zeitpunkt als root ausgeführt)?

     [EACCES]       Permission bits of the file mode do not permit the
            requested access, or search permission is denied on a
            component of the path prefix.

@ifullgaz Ich habe den Vorschlag von https://www.laurivan.com/make-electron-work-with-knex-js/ gefunden, der diese Fehler behoben hat:

WARNING in ./node_modules/knex/lib/migrate/index.js
342:20-81 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/migrate/index.js
447:18-49 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/seed/index.js
113:13-74 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/seed/index.js
150:11-24 Critical dependency: the request of a dependency is an expression

Insbesondere dieser Teil hat bei mir funktioniert:

config.plugins = [
  // ...
  new NormalModuleReplacementPlugin(/\.\.\/migrate/, '../util/noop.js'),
  new NormalModuleReplacementPlugin(/\.\.\/seed/, '../util/noop.js'),
];

das war das Ticket für mich libraryTarget: 'commonjs2',

Ich habe mir einen etwas anderen Ansatz angesehen, der es Webpack ermöglicht, die meisten require -Anweisungen in den Knex-Dateien zu verarbeiten, aber die nicht wörtlichen require s allein lässt, sodass die Migrations- und Seed-Dateien vom Benutzer bereitgestellt werden der Bibliothek zu finden. Hier ist der Ansatz, den ich gewählt habe:

config.module.rules = [
  {
    include: [
      /knex\/lib\/migrate\/index/,
      /knex\/lib\/seed\/index/
    ],
    loader: 'string-replace-loader',
    options: {
      search: 'require(\\([^\'"])',
      replace: '__non_webpack_require__$1',
      flags: 'g'
    }
  }
];

Hallo Leute, ich habe daran gearbeitet, das Problem zu lösen, ein vollständiges Webpack-Bundle für einen Dienst mit Knex zu erstellen, und bin auf dieses Problem gestoßen, als ich versuchte, Migrationen programmgesteuert von diesem Bundle auszuführen. Der Vorschlag von @mdlavin führte zwar dazu, dass die Anforderung ausgeführt wurde, führte jedoch dazu, dass das Webpack die Quelldatei nicht transformierte. Es bedeutete auch, dass ich dieses Verzeichnis mit dem Bundle-Out-of-Band aus dem Webpack-Bundle aufnehmen musste.

Ich habe herausgefunden, dass Sie ContextReplacementPlugin von webpack verwenden können, um das Problem mit Migrationen und Seeds zu lösen. Unten ist ein Beispiel aus meiner Konfiguration (in Schreibmaschine geschrieben):

plugins: [
  //...
  fs.existsSync(path.join(params.targetPackageFilePath, 'migrations')) && new webpack.ContextReplacementPlugin(
    /knex\/lib\/migrate/,
    '.',
    fs.readdirSync(path.join(params.targetPackageFilePath, 'migrations'))
      .reduce((result, file) => {
        return Object.assign(result, {
          [path.join(params.targetPackageFilePath, 'migrations', file)]: path.relative(
            path.dirname(require.resolve('knex/lib/migrate')),
            path.join(params.targetPackageFilePath, 'migrations', file)
          )
        });
      }, {})),

  fs.existsSync(path.join(params.targetPackageFilePath, 'seeds')) && new webpack.ContextReplacementPlugin(
    /knex\/lib\/seed/,
    '.',
    fs.readdirSync(path.join(params.targetPackageFilePath, 'seeds'))
      .reduce((result, file) => {
        return Object.assign(result, {
          [path.join(params.targetPackageFilePath, 'seeds', file)]: path.relative(
            path.dirname(require.resolve('knex/lib/seed')),
            path.join(params.targetPackageFilePath, 'seeds', file)
          )
        });
      }, {}))
  //...
]

In meiner Konfiguration ist params.targetPackageFiletPath der aufgelöste Pfad zu dem zu kompilierenden Paket, zB /Users/yourusername/yourproject . Wenn also ein Projekt in diesem Pfad die Verzeichnisse migrations und seeds hat, würden die resultierenden Plugin-Konfigurationen in etwa so aussehen:

  fs.existsSync(path.join(params.targetPackageFilePath, 'migrations')) && new webpack.ContextReplacementPlugin(
    /knex\/lib\/migrate/,
    '.',
    {
      '/Users/yourusername/yourproject/201706261234_migration.ts': '../../../migrations/201706261234_migration.ts'
    }),

  fs.existsSync(path.join(params.targetPackageFilePath, 'seeds')) && new webpack.ContextReplacementPlugin(
    /knex\/lib\/seed/,
    '.',
    {
      '/Users/yourusername/yourproject/seeds/201706261234_first-seed.ts': '../../../seeds/201706261234_first-seed.ts'
    }),

Um dies ein wenig aufzuschlüsseln, das Problem ist, dass der Migrations- und Seed-Code von Knex require aufruft, um Ihre Migrationen und Seeds zu laden, wie es hier https://github.com/tgriesser/knex/blob/master/ src/migrate/index.js#L54. Es übergibt das Ergebnis einer Funktion/eines Ausdrucks an require ohne fest codiertes Zeichenfolgenpräfix oder -suffix. Wenn Webpack also versucht, herauszufinden, welche Dateien tatsächlich geladen werden, verfügt es nicht über genügend Informationen, um dies festzustellen. Diese Plugins stellen Webpack die erforderlichen Informationen zur Verfügung.

Ich bin mir nicht sicher, ob Knex geändert werden könnte, um diese beim Bündeln mit Webpack unnötig zu machen. Vielleicht indem Sie die Anforderungen im Benutzerland erfüllen?

Wie auch immer, ich dachte, ich würde eine Lösung teilen, die für mich funktioniert hat.

Irgendwelche Vorschläge für dieses Problem in Angular?
Ich versuche, Express Project zu verwenden, es ist normal (es wird kein Fehler angezeigt). Aber wenn ich es in einem Angular-Projekt verwende, zeigt es den Fehler:

ERROR in ./node_modules/knex/lib/dialects/oracle/utils.js Module not found: Error: Can't resolve 'crypto' in '/Users/marudits/Documents/CODE/PROJECT/MOJOMARET/app-member/node_modules/knex/lib/dialects/oracle' ERROR in ./node_modules/knex/lib/dialects/mssql/index.js Module not found: Error: Can't resolve 'mssql/package.json' in '/Users/marudits/Documents/CODE/PROJECT/MOJOMARET/app-member/node_modules/knex/lib/dialects/mssql' ERROR in ./node_modules/knex/lib/runner.js Module not found: Error: Can't resolve 'stream' in '/Users/marudits/Documents/CODE/PROJECT/MOJOMARET/app-member/node_modules/knex/lib' ERROR in ./node_modules/knex/lib/dialects/oracledb/index.js Module not found: Error: Can't resolve 'stream' in '/Users/marudits/Documents/CODE/PROJECT/MOJOMARET/app-member/node_modules/knex/lib/dialects/oracledb'

Wo kann ich die Konfiguration vornehmen, um diesen Fehler zu entfernen?
könnte es auf angular.json oder tsconfig.json Datei eingerichtet werden?

Höchstwahrscheinlich im Webpack.

Dies hat es für mich behoben (Dank an @ifullgaz ), ich musste mysql2 hinzufügen.

    externals: {
        // Possible drivers for knex - we'll ignore them
        sqlite3: 'sqlite3',
        mysql2: 'mysql2',
        mariasql: 'mariasql',
        mysql: 'mysql',
        oracle: 'oracle',
        'strong-oracle': 'strong-oracle',
        oracledb: 'oracledb',
        pg: 'pg',
        'pg-query-stream': 'pg-query-stream'
    }

Dann entfernen Sie einfach den Treiber, den Sie verwenden, aus dieser Liste und Webpack wird ihn in den Build aufnehmen.

@ifullgaz Ich habe den Vorschlag von https://www.laurivan.com/make-electron-work-with-knex-js/ gefunden, der diese Fehler behoben hat:

WARNING in ./node_modules/knex/lib/migrate/index.js
342:20-81 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/migrate/index.js
447:18-49 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/seed/index.js
113:13-74 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/seed/index.js
150:11-24 Critical dependency: the request of a dependency is an expression

Insbesondere dieser Teil hat bei mir funktioniert:

config.plugins = [
  // ...
  new NormalModuleReplacementPlugin(/\.\.\/migrate/, '../util/noop.js'),
  new NormalModuleReplacementPlugin(/\.\.\/seed/, '../util/noop.js'),
];

Das hat bei mir super funktioniert. Ich tat dies:

plugins: [
    new webpack.NormalModuleReplacementPlugin(/m[sy]sql2?|oracle(db)?|sqlite3/, "node-noop"),
    new webpack.NormalModuleReplacementPlugin(/\.\.\/migrate/, "node-noop"),
    new webpack.NormalModuleReplacementPlugin(/\.\.\/seed/, "node-noop")
  ]

1) Ich konnte den relativen Import von noop.js nicht zum Laufen bringen, weil er versuchte, ihn tief in Knex zu importieren. Ich habe gerade diese einfache node-noop Lib installiert und das hat gut funktioniert.
2) Wir verwenden Postgres, sodass die Regex in der ersten Zeile mit allen anderen übereinstimmt, nach denen sie sucht. Modifizieren Sie nach Herzenslust.

2019/10 habe ich es geschafft, es zum Laufen zu bringen, siehe meine Antwort in einer anderen Ausgabe https://github.com/tgriesser/knex/issues/1446#issuecomment -537715431

Ich habe pg-Abhängigkeit als "extern" festgelegt und es hat das Problem gelöst, vielen Dank. Bedeutet das, dass Webpack die Back-End-Abhängigkeiten analysiert?

Hallo Leute, ich habe daran gearbeitet, das Problem zu lösen, ein vollständiges Webpack-Bundle für einen Dienst mit Knex zu erstellen, und bin auf dieses Problem gestoßen, als ich versuchte, Migrationen programmgesteuert von diesem Bundle auszuführen. Der Vorschlag von @mdlavin führte zwar dazu, dass die Anforderung ausgeführt wurde, führte jedoch dazu, dass das Webpack die Quelldatei nicht transformierte. Es bedeutete auch, dass ich dieses Verzeichnis mit dem Bundle-Out-of-Band aus dem Webpack-Bundle aufnehmen musste.

Ich habe herausgefunden, dass Sie ContextReplacementPlugin von webpack verwenden können, um das Problem mit Migrationen und Seeds zu lösen. Unten ist ein Beispiel aus meiner Konfiguration (in Schreibmaschine geschrieben):

plugins: [
  //...
  fs.existsSync(path.join(params.targetPackageFilePath, 'migrations')) && new webpack.ContextReplacementPlugin(
    /knex\/lib\/migrate/,
    '.',
    fs.readdirSync(path.join(params.targetPackageFilePath, 'migrations'))
      .reduce((result, file) => {
        return Object.assign(result, {
          [path.join(params.targetPackageFilePath, 'migrations', file)]: path.relative(
            path.dirname(require.resolve('knex/lib/migrate')),
            path.join(params.targetPackageFilePath, 'migrations', file)
          )
        });
      }, {})),

  fs.existsSync(path.join(params.targetPackageFilePath, 'seeds')) && new webpack.ContextReplacementPlugin(
    /knex\/lib\/seed/,
    '.',
    fs.readdirSync(path.join(params.targetPackageFilePath, 'seeds'))
      .reduce((result, file) => {
        return Object.assign(result, {
          [path.join(params.targetPackageFilePath, 'seeds', file)]: path.relative(
            path.dirname(require.resolve('knex/lib/seed')),
            path.join(params.targetPackageFilePath, 'seeds', file)
          )
        });
      }, {}))
  //...
]

In meiner Konfiguration ist params.targetPackageFiletPath der aufgelöste Pfad zu dem zu kompilierenden Paket, zB /Users/yourusername/yourproject . Wenn also ein Projekt in diesem Pfad die Verzeichnisse migrations und seeds hat, würden die resultierenden Plugin-Konfigurationen in etwa so aussehen:

  fs.existsSync(path.join(params.targetPackageFilePath, 'migrations')) && new webpack.ContextReplacementPlugin(
    /knex\/lib\/migrate/,
    '.',
    {
      '/Users/yourusername/yourproject/201706261234_migration.ts': '../../../migrations/201706261234_migration.ts'
    }),

  fs.existsSync(path.join(params.targetPackageFilePath, 'seeds')) && new webpack.ContextReplacementPlugin(
    /knex\/lib\/seed/,
    '.',
    {
      '/Users/yourusername/yourproject/seeds/201706261234_first-seed.ts': '../../../seeds/201706261234_first-seed.ts'
    }),

Um dies ein wenig aufzuschlüsseln, das Problem ist, dass der Migrations- und Seed-Code von Knex require aufruft, um Ihre Migrationen und Seeds zu laden, wie es hier https://github.com/tgriesser/knex/blob/master/ src/migrate/index.js#L54. Es übergibt das Ergebnis einer Funktion/eines Ausdrucks an require ohne fest codiertes Zeichenfolgenpräfix oder -suffix. Wenn Webpack also versucht, herauszufinden, welche Dateien tatsächlich geladen werden, verfügt es nicht über genügend Informationen, um dies festzustellen. Diese Plugins stellen Webpack die erforderlichen Informationen zur Verfügung.

Ich bin mir nicht sicher, ob Knex geändert werden könnte, um diese beim Bündeln mit Webpack unnötig zu machen. Vielleicht indem Sie die Anforderungen im Benutzerland erfüllen?

Wie auch immer, ich dachte, ich würde eine Lösung teilen, die für mich funktioniert hat.

Rette meine Tage, vielen Dank.

Für diejenigen, die nach einer Lösung suchen, diese funktionierte für mich mit knex@^0.21.1, ich wollte, dass der mysql2 -Treiber beibehalten wird. Ich habe 2 vorhandene Lösungen genommen, die für mich zusammengearbeitet haben.

Fügen Sie in der Webpack-Konfiguration eine modifizierte Version von https://github.com/knex/knex/issues/1128#issuecomment -515573845 ein

externals: [
      {
        // Possible drivers for knex - we'll ignore them
       // comment the one YOU WANT to use
        sqlite3: 'sqlite3',
        // mysql2: 'mysql2', // << using this one
        mariasql: 'mariasql',
        mysql: 'mysql',
        mssql: 'mssql',
        oracle: 'oracle',
        'strong-oracle': 'strong-oracle',
        oracledb: 'oracledb',
        pg: 'pg',
        'pg-query-stream': 'pg-query-stream',
      }

Fügen Sie auch ein Webpack-Plugin hinzu, das die anstößigen Pakete ausschließt
siehe https://github.com/knex/knex/issues/3130#issuecomment -573293311

Ich habe das Original geändert, um es in meinem Anwendungsfall korrekt auszuschließen, einschließlich des richtigen Satzes von mssql -Unterverzeichnissen und auch, um einige pg -Pakete zuzulassen, die für das Funktionieren von Knex erforderlich sind

    new webpack.IgnorePlugin(
        new RegExp('^(mssql*|mariasql|.oracle.|sqlite3|mssql/.*|tedious|node-pre-gyp)$')
      ),
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

lanceschi picture lanceschi  ·  3Kommentare

mtom55 picture mtom55  ·  3Kommentare

aj0strow picture aj0strow  ·  3Kommentare

fsebbah picture fsebbah  ·  3Kommentare

rarkins picture rarkins  ·  3Kommentare