Knex: Erreurs "Module introuvable" lors de l'utilisation de knex avec webpack

Créé le 6 janv. 2016  ·  23Commentaires  ·  Source: knex/knex

J'essaie d'utiliser knex dans un projet sur lequel je travaille. Le problème que j'ai est que lorsque j'essaie d'exécuter webpack, il trace les besoins et tente d'extraire des pilotes/dialectes que je n'utilise pas et que je n'ai pas installés.

Des idées sur la façon dont cela peut être résolu?

Journal ``````
ERREUR dans ./~/mariasql/lib/Client.js
Module introuvable : erreur : impossible de résoudre le 'fichier' ou le 'répertoire' ../build/Debug/sqlclient dans ~/project/node_modules/mariasql/lib
@ ./~/mariasql/lib/Client.js 17:10-45

ERREUR dans ./~/knex/lib/dialects/sqlite3/index.js
Module introuvable : erreur : impossible de résoudre le module 'sqlite3' dans ~/project/node_modules/knex/lib/dialects/sqlite3
@ ./~/knex/lib/dialects/sqlite3/index.js 33:11-29

ERREUR dans ./~/knex/lib/dialects/mysql2/index.js
Module introuvable : erreur : Impossible de résoudre le module 'mysql2' dans ~/project/node_modules/knex/lib/dialects/mysql2
@ ./~/knex/lib/dialects/mysql2/index.js 33:11-28

ERREUR dans ./~/knex/lib/dialects/mysql/index.js
Module introuvable : erreur : Impossible de résoudre le module 'mysql' dans ~/project/node_modules/knex/lib/dialects/mysql
@ ./~/knex/lib/dialects/mysql/index.js 35:11-27

ERREUR dans ./~/knex/lib/dialects/oracle/index.js
Module introuvable : erreur : impossible de résoudre le module 'oracle' dans ~/project/node_modules/knex/lib/dialects/oracle
@ ./~/knex/lib/dialects/oracle/index.js 40:11-28

ERREUR dans ./~/knex/lib/dialects/postgres/index.js
Module introuvable : erreur : Impossible de résoudre le module 'pg' dans ~/project/node_modules/knex/lib/dialects/postgres
@ ./~/knex/lib/dialects/postgres/index.js 46:11-24

ERREUR dans ./~/knex/lib/dialects/postgres/index.js
Module introuvable : erreur : impossible de résoudre le module 'pg-query-stream' dans ~/project/node_modules/knex/lib/dialects/postgres
@ ./~/knex/lib/dialects/postgres/index.js 132:50-76

ERREUR dans ./~/knex/lib/dialects/strong-oracle/index.js
Module introuvable : erreur : impossible de résoudre le module 'strong-oracle' dans ~/project/node_modules/knex/lib/dialects/strong-oracle
@ ./~/knex/lib/dialects/strong-oracle/index.js 15:9-33```
``````

Commentaire le plus utile

s'est également heurté à cela. ce qui fonctionne pour moi ;

externals: {
  knex: 'commonjs knex'
}

Tous les 23 commentaires

J'ai eu ce problème, mais l'ajout d'un Regex à mes externals dans ma configuration webpack l'a résolu :

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 Ignorer le répertoire node_modules ne résout pas vraiment le problème, nous travaillons simplement autour du problème. Ce serait génial si le code faisait ces besoins d'une manière plus intelligente qui ne génère pas d'erreurs.

Aussi couru dans ce. Je ne sais pas trop pourquoi ignorer node_modules ne fonctionne pas.

s'est également heurté à cela. ce qui fonctionne pour moi ;

externals: {
  knex: 'commonjs knex'
}

Je ne peux pas commenter spécifiquement le problème mariasql mais ce qui a résolu mon problème est de définir tous les pilotes que je n'utilise pas comme externes. Par exemple, j'utilise le pilote mysql2 pour mon projet donc j'ai ceci dans les 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'
  }

Le résultat est que knex est regroupé sans erreurs ni avertissements

Ce problème semble n'être qu'un problème de configuration de la configuration de Webpack lors de l'inclusion de knex... rouvrirons si des modifications sont nécessaires dans knex pour mieux prendre en charge Webpack.

En fait, je ne pense pas que le problème doive encore être clos, il y a encore des problèmes non résolus avec webpack, avec migration et 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

Je n'ai pas pu les réparer

@ifullgaz qui ne semble pas être une erreur, mais juste un avertissement qui nécessite () n'a pas été utilisé avec un littéral de chaîne? https://github.com/webpack/webpack/issues/196

@ifullgaz , j'ai essayé votre solution, mais j'ai des erreurs comme ci-dessous. Avez-vous rencontré un problème similaire?

  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 avez-vous corrigé la propriété, etc. du répertoire node_modules et de tout son contenu (vous n'avez à aucun moment exécuté npm install en tant que root) ?

     [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 J'ai trouvé la suggestion de https://www.laurivan.com/make-electron-work-with-knex-js/ corrigé ces erreurs :

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

Plus précisément, cette partie a fonctionné pour moi:

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

c'était le billet pour moi libraryTarget: 'commonjs2',

J'ai cherché une approche légèrement différente qui permet à Webpack de traiter la plupart des instructions require dans les fichiers knex, mais laissera les require non littéraux seuls afin que les fichiers de migration et de départ fournis par l'utilisateur de la bibliothèque se trouve. Voici l'approche que j'ai prise:

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'
    }
  }
];

Salut les gens, je travaillais pour résoudre le problème de la création d'un ensemble Webpack complet pour un service utilisant knex et j'ai rencontré ce problème en essayant d'exécuter des migrations par programme à partir de cet ensemble. La suggestion de @mdlavin lui a permis d'exécuter le besoin, mais il en est résulté que webpack ne transformait pas le fichier source. Cela signifiait également que je devais inclure ce répertoire avec le bundle hors bande du bundle webpack.

J'ai compris que vous pouvez utiliser ContextReplacementPlugin de Webpack pour résoudre le problème avec les migrations et les graines. Ci-dessous un exemple de ma configuration (écrit en tapuscrit):

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)
          )
        });
      }, {}))
  //...
]

Dans ma configuration, params.targetPackageFiletPath est le chemin résolu vers le package en cours de compilation, par exemple /Users/yourusername/yourproject . Donc, si un projet sur ce chemin a des répertoires migrations et seeds , les configurations de plug-in résultantes ressembleraient à ceci :

  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'
    }),

Pour décomposer un peu cela, le problème est que le code de migration et de démarrage de knex appelle require pour charger vos migrations et vos semences, comme il le fait ici https://github.com/tgriesser/knex/blob/master/ src/migrate/index.js#L54. Il transmet le résultat d'une fonction/expression à exiger sans préfixe ni suffixe de chaîne codé en dur. Ainsi, lorsque webpack tente de déterminer quels fichiers pourraient réellement se charger, il ne dispose pas de suffisamment d'informations pour le déterminer. Ces plugins fournissent les informations nécessaires à Webpack.

Je ne sais pas si Knex pourrait être modifié pour les rendre inutiles lors du regroupement avec webpack. Peut-être en faisant les exigences dans user-land ?

Quoi qu'il en soit, j'ai pensé partager une solution qui a fonctionné pour moi.

Une suggestion pour ce problème dans Angular?
J'essaie d'utiliser le projet express, c'est normal (ne montrant aucune erreur). Mais quand je l'utilise dans le projet Angular, il affiche l'erreur :

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'

où puis-je faire la configuration pour supprimer cette erreur?
pourrait-il être configuré sur un fichier angular.json ou tsconfig.json ?

En webpack très probablement.

Cela l'a corrigé pour moi (crédit à @ifullgaz ) J'ai dû ajouter mysql2.

    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'
    }

Ensuite, supprimez simplement le pilote que vous utilisez de cette liste et Webpack l'inclura dans la construction.

@ifullgaz J'ai trouvé la suggestion de https://www.laurivan.com/make-electron-work-with-knex-js/ corrigé ces erreurs :

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

Plus précisément, cette partie a fonctionné pour moi:

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

Cela a très bien fonctionné pour moi. J'ai fait ça:

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) Je n'ai pas pu faire fonctionner l'importation relative de noop.js car il essayait de l'importer au plus profond de knex. Je viens d'installer cette simple bibliothèque node-noop et cela a bien fonctionné.
2) Nous utilisons Postgres, donc la regex de la première ligne correspond à toutes les autres qu'elle recherche. Modifiez au contenu de votre coeur.

2019/10 j'ai réussi à le faire fonctionner, voir ma réponse dans un autre numéro https://github.com/tgriesser/knex/issues/1446#issuecomment -537715431

J'ai mis la dépendance pg comme "externe" et cela a résolu le problème merci beaucoup, cela signifie-t-il que webpack analyse les dépendances back-end ?

Salut les gens, je travaillais pour résoudre le problème de la création d'un ensemble Webpack complet pour un service utilisant knex et j'ai rencontré ce problème en essayant d'exécuter des migrations par programme à partir de cet ensemble. La suggestion de @mdlavin lui a permis d'exécuter le besoin, mais il en est résulté que webpack ne transformait pas le fichier source. Cela signifiait également que je devais inclure ce répertoire avec le bundle hors bande du bundle webpack.

J'ai compris que vous pouvez utiliser ContextReplacementPlugin de Webpack pour résoudre le problème avec les migrations et les graines. Ci-dessous un exemple de ma configuration (écrit en tapuscrit):

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)
          )
        });
      }, {}))
  //...
]

Dans ma configuration, params.targetPackageFiletPath est le chemin résolu vers le package en cours de compilation, par exemple /Users/yourusername/yourproject . Donc, si un projet sur ce chemin a des répertoires migrations et seeds , les configurations de plug-in résultantes ressembleraient à ceci :

  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'
    }),

Pour décomposer un peu cela, le problème est que le code de migration et de démarrage de knex appelle require pour charger vos migrations et vos semences, comme il le fait ici https://github.com/tgriesser/knex/blob/master/ src/migrate/index.js#L54. Il transmet le résultat d'une fonction/expression à exiger sans préfixe ni suffixe de chaîne codé en dur. Ainsi, lorsque webpack tente de déterminer quels fichiers pourraient réellement se charger, il ne dispose pas de suffisamment d'informations pour le déterminer. Ces plugins fournissent les informations nécessaires à Webpack.

Je ne sais pas si Knex pourrait être modifié pour les rendre inutiles lors du regroupement avec webpack. Peut-être en faisant les exigences dans user-land ?

Quoi qu'il en soit, j'ai pensé partager une solution qui a fonctionné pour moi.

Sauvez mes jours, merci beaucoup.

Pour ceux qui recherchent une solution, celle-ci a fonctionné pour moi en utilisant knex@^0.21.1, je voulais conserver le pilote mysql2 . J'ai pris 2 solutions existantes, qui ont fonctionné ensemble pour moi.

Dans la configuration Webpack, fusionnez dans une version modifiée de https://github.com/knex/knex/issues/1128#issuecomment -515573845

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',
      }

Ajoutez également un plugin webpack, qui exclura les packages incriminés
réf https://github.com/knex/knex/issues/3130#issuecomment -573293311

J'ai modifié l'original pour exclure correctement dans mon cas d'utilisation, y compris l'ensemble correct de sous-répertoires mssql et également pour autoriser certains packages pg nécessaires au fonctionnement de Knex

    new webpack.IgnorePlugin(
        new RegExp('^(mssql*|mariasql|.oracle.|sqlite3|mssql/.*|tedious|node-pre-gyp)$')
      ),
Cette page vous a été utile?
0 / 5 - 0 notes