Knex: Ошибки «Модуль не найден» при использовании knex с webpack

Созданный на 6 янв. 2016  ·  23Комментарии  ·  Источник: knex/knex

Я пытаюсь использовать knex в проекте, над которым работаю. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь запустить веб-пакет, он отслеживает требования и пытается установить драйверы/диалекты, которые я не использую и не устанавливал.

Любые мысли о том, как это можно решить?

````` журнал
ОШИБКА в ./~/mariasql/lib/Client.js
Модуль не найден: ошибка: не удается разрешить «файл» или «каталог».../build/Debug/sqlclient в ~/project/node_modules/mariasql/lib
@ ./~/mariasql/lib/Client.js 17:10-45

ОШИБКА в ./~/knex/lib/dialects/sqlite3/index.js
Модуль не найден: ошибка: не удается разрешить модуль sqlite3 в ~/project/node_modules/knex/lib/dialects/sqlite3
@ ./~/knex/lib/dialects/sqlite3/index.js 33:11-29

ОШИБКА в ./~/knex/lib/dialects/mysql2/index.js
Модуль не найден: ошибка: не удается разрешить модуль «mysql2» в ~/project/node_modules/knex/lib/dialects/mysql2
@ ./~/knex/lib/dialects/mysql2/index.js 33:11-28

ОШИБКА в ./~/knex/lib/dialects/mysql/index.js
Модуль не найден: ошибка: не удается разрешить модуль «mysql» в ~/project/node_modules/knex/lib/dialects/mysql
@ ./~/knex/lib/dialects/mysql/index.js 35:11-27

ОШИБКА в ./~/knex/lib/dialects/oracle/index.js
Модуль не найден: ошибка: не удается разрешить модуль «оракул» в ~/project/node_modules/knex/lib/dialects/oracle
@ ./~/knex/lib/dialects/oracle/index.js 40:11-28

ОШИБКА в ./~/knex/lib/dialects/postgres/index.js
Модуль не найден: ошибка: не удается разрешить модуль «pg» в ~/project/node_modules/knex/lib/dialects/postgres
@ ./~/knex/lib/dialects/postgres/index.js 46:11-24

ОШИБКА в ./~/knex/lib/dialects/postgres/index.js
Модуль не найден: ошибка: не удается разрешить модуль «pg-query-stream» в ~/project/node_modules/knex/lib/dialects/postgres
@ ./~/knex/lib/dialects/postgres/index.js 132:50-76

ОШИБКА в ./~/knex/lib/dialects/strong-oracle/index.js
Модуль не найден: ошибка: не удается разрешить модуль «strong-oracle» в ~/project/node_modules/knex/lib/dialects/strong-oracle
@ ./~/knex/lib/dialects/strong-oracle/index.js 15:9-33```
``````

Самый полезный комментарий

тоже столкнулся с этим. что работает для меня;

externals: {
  knex: 'commonjs knex'
}

Все 23 Комментарий

У меня была эта проблема, но добавление регулярного выражения к моим внешним данным в моей конфигурации веб-пакета исправило ее:

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 Игнорирование каталога node_modules на самом деле не решает проблему, мы просто работаем над ее решением. Было бы здорово, если бы код выполнял эти требования более разумно, не вызывая ошибок.

Тоже столкнулся с этим. Не совсем уверен, почему игнорирование node_modules не работает.

тоже столкнулся с этим. что работает для меня;

externals: {
  knex: 'commonjs knex'
}

Я не могу конкретно комментировать проблему mariasql, но моя проблема решена путем определения всех драйверов, которые я не использую, как внешних. Например, я использую драйвер mysql2 для своего проекта, поэтому у меня есть это во внешних файлах:

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

В результате knex собирается без ошибок и предупреждений.

Эта проблема кажется просто проблемой, как настроить конфигурацию веб-пакета при включении knex... позволяет повторно открыть, если в knex требуются изменения для лучшей поддержки веб-пакета.

Собственно, я не думаю, что тему стоит закрывать еще, есть еще нерешенные проблемы с вебпаком, с миграцией и сидом:

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

Я не мог исправить это

@ifullgaz , похоже, это не ошибка, а просто предупреждение о том, что require () не использовалось со строковым литералом? https://github.com/webpack/webpack/issues/196

@ifullgaz , я попробовал ваше решение, но получил ошибки, как показано ниже. Вы столкнулись с подобной проблемой?

  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 правильно ли вы владеете каталогом node_modules и всем его содержимым (вы никогда не запускали npm install от имени пользователя 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 Я нашел предложение от https://www.laurivan.com/make-electron-work-with-knex-js/ , исправил эти ошибки:

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

В частности, эта часть работала для меня:

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

это был билет для меня libraryTarget: 'commonjs2',

Я рассмотрел немного другой подход, который позволяет веб-пакету обрабатывать большинство операторов require в файлах knex, но оставляет только небуквальные require s, так что файлы миграции и начальные файлы, предоставленные пользователем библиотеки можно найти. Вот мой подход:

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

Привет, ребята, я работал над решением проблемы создания полного пакета веб-пакетов для службы с использованием knex и столкнулся с этой проблемой при попытке программно запустить миграцию из этого пакета. Предложение @mdlavin заставило его запустить требование, но это привело к тому, что веб-пакет не преобразовал исходный файл. Это также означало, что мне нужно было включить этот каталог с пакетом из пакета веб-пакета.

Я понял, что вы можете использовать ContextReplacementPlugin веб-пакета, чтобы решить проблему с миграциями и семенами. Ниже пример из моего конфига (написанный на машинописном языке):

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

В моей конфигурации params.targetPackageFiletPath — это разрешенный путь к компилируемому пакету, например, /Users/yourusername/yourproject . Таким образом, если в проекте по этому пути есть каталоги migrations и seeds , результирующие конфигурации плагинов будут выглядеть примерно так:

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

Чтобы немного разбить это, проблема заключается в том, что код миграции и начального числа knex вызывает require для загрузки ваших миграций и начальных значений, как это делается здесь https://github.com/tgriesser/knex/blob/master/ src/мигрировать/index.js#L54. Он передает результат функции/выражения в запрос без жестко закодированного строкового префикса или суффикса, поэтому, когда веб-пакет пытается выяснить, какие файлы могут фактически загрузиться, у него недостаточно информации, чтобы определить это. Эти плагины предоставляют необходимую информацию для webpack.

Я не уверен, можно ли изменить Knex, чтобы сделать их ненужными при связывании с webpack. Может быть, выполнив требования в пользовательской зоне?

В любом случае, я подумал, что поделюсь решением, которое сработало для меня.

Любое предложение по этой проблеме в Angular?
Я пытаюсь использовать экспресс-проект, это нормально (без ошибок). Но когда я использую его в проекте Angular, он показывает ошибку:

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'

где я могу сделать конфигурацию, чтобы удалить эту ошибку?
может ли он быть установлен в файле angular.json или tsconfig.json ?

В вебпаке скорее всего.

Это исправило это для меня (кредит @ifullgaz ), мне пришлось добавить 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'
    }

Затем просто удалите драйвер, который вы используете, из этого списка, и веб-пакет включит его в сборку.

@ifullgaz Я нашел предложение от https://www.laurivan.com/make-electron-work-with-knex-js/ , исправил эти ошибки:

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

В частности, эта часть работала для меня:

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

Это отлично сработало для меня. Я сделал это:

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) Я не мог заставить работать относительный импорт noop.js , потому что он пытался импортировать его глубоко внутри knex. Я только что установил эту простую библиотеку node-noop , и она работала нормально.
2) Мы используем Postgres, поэтому регулярное выражение в первой строке совпадает со всеми остальными, которые оно ищет. Измените содержание вашего сердца.

2019/10 Мне удалось заставить его работать, см. мой ответ в другом выпуске https://github.com/tgriesser/knex/issues/1446#issuecomment -537715431

Я поставил зависимость pg как «внешнюю», и это решило проблему, большое спасибо, означает ли это, что веб-пакет анализирует внутренние зависимости?

Привет, ребята, я работал над решением проблемы создания полного пакета веб-пакетов для службы с использованием knex и столкнулся с этой проблемой при попытке программно запустить миграцию из этого пакета. Предложение @mdlavin заставило его запустить требование, но это привело к тому, что веб-пакет не преобразовал исходный файл. Это также означало, что мне нужно было включить этот каталог с пакетом из пакета веб-пакета.

Я понял, что вы можете использовать ContextReplacementPlugin веб-пакета, чтобы решить проблему с миграциями и семенами. Ниже пример из моего конфига (написанный на машинописном языке):

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

В моей конфигурации params.targetPackageFiletPath — это разрешенный путь к компилируемому пакету, например, /Users/yourusername/yourproject . Таким образом, если в проекте по этому пути есть каталоги migrations и seeds , результирующие конфигурации плагинов будут выглядеть примерно так:

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

Чтобы немного разбить это, проблема заключается в том, что код миграции и начального числа knex вызывает require для загрузки ваших миграций и начальных значений, как это делается здесь https://github.com/tgriesser/knex/blob/master/ src/мигрировать/index.js#L54. Он передает результат функции/выражения в запрос без жестко закодированного строкового префикса или суффикса, поэтому, когда веб-пакет пытается выяснить, какие файлы могут фактически загрузиться, у него недостаточно информации, чтобы определить это. Эти плагины предоставляют необходимую информацию для webpack.

Я не уверен, можно ли изменить Knex, чтобы сделать их ненужными при связывании с webpack. Может быть, выполнив требования в пользовательской зоне?

В любом случае, я подумал, что поделюсь решением, которое сработало для меня.

Спасите мои дни, большое спасибо.

Для тех, кто ищет решение, это сработало для меня, используя knex@^0.21.1, я хотел сохранить драйвер mysql2 . Я взял 2 существующих решения, которые работали вместе для меня.

В конфиге webpack слить модифицированную версию 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',
      }

Также добавьте плагин webpack, который исключит проблемные пакеты.
ссылка https://github.com/knex/knex/issues/3130#issuecomment -573293311

Я изменил оригинал, чтобы правильно исключить в моем случае использования, включая правильный набор подкаталогов mssql , а также разрешить некоторые пакеты pg , необходимые для работы Knex.

    new webpack.IgnorePlugin(
        new RegExp('^(mssql*|mariasql|.oracle.|sqlite3|mssql/.*|tedious|node-pre-gyp)$')
      ),
Была ли эта страница полезной?
0 / 5 - 0 рейтинги