Knex: Kesalahan "Modul tidak ditemukan" saat menggunakan knex dengan webpack

Dibuat pada 6 Jan 2016  ·  23Komentar  ·  Sumber: knex/knex

Saya mencoba menggunakan knex dalam proyek yang sedang saya kerjakan. Masalah yang saya alami adalah ketika saya mencoba menjalankan webpack, itu melacak kebutuhan dan mencoba menarik driver/dialek yang tidak saya gunakan dan belum instal.

Adakah pemikiran tentang bagaimana ini bisa diselesaikan?

`````` log
GALAT di ./~/mariasql/lib/Client.js
Modul tidak ditemukan: Kesalahan: Tidak dapat menyelesaikan 'file' atau 'direktori' ../build/Debug/sqlclient di ~/project/node_modules/mariasql/lib
@ ./~/mariasql/lib/Client.js 17:10-45

GALAT dalam ./~/knex/lib/dialects/sqlite3/index.js
Modul tidak ditemukan: Kesalahan: Tidak dapat menyelesaikan modul 'sqlite3' di ~/project/node_modules/knex/lib/dialects/sqlite3
@ ./~/knex/lib/dialects/sqlite3/index.js 33:11-29

GALAT di ./~/knex/lib/dialects/mysql2/index.js
Modul tidak ditemukan: Kesalahan: Tidak dapat menyelesaikan modul 'mysql2' di ~/project/node_modules/knex/lib/dialects/mysql2
@ ./~/knex/lib/dialects/mysql2/index.js 33:11-28

GALAT di ./~/knex/lib/dialects/mysql/index.js
Modul tidak ditemukan: Kesalahan: Tidak dapat menyelesaikan modul 'mysql' di ~/project/node_modules/knex/lib/dialects/mysql
@ ./~/knex/lib/dialects/mysql/index.js 35:11-27

GALAT dalam ./~/knex/lib/dialects/Oracle/index.js
Modul tidak ditemukan: Kesalahan: Tidak dapat menyelesaikan modul 'Oracle' di ~/project/node_modules/knex/lib/dialects/Oracle
@ ./~/knex/lib/dialects/Oracle/index.js 40:11-28

GALAT dalam ./~/knex/lib/dialects/postgres/index.js
Modul tidak ditemukan: Kesalahan: Tidak dapat menyelesaikan modul 'pg' di ~/project/node_modules/knex/lib/dialects/postgres
@ ./~/knex/lib/dialects/postgres/index.js 46:11-24

GALAT dalam ./~/knex/lib/dialects/postgres/index.js
Modul tidak ditemukan: Kesalahan: Tidak dapat menyelesaikan modul 'pg-query-stream' di ~/project/node_modules/knex/lib/dialects/postgres
@ ./~/knex/lib/dialects/postgres/index.js 132:50-76

GALAT di ./~/knex/lib/dialects/strong-Oracle/index.js
Modul tidak ditemukan: Kesalahan: Tidak dapat menyelesaikan modul 'strong-Oracle' di ~/project/node_modules/knex/lib/dialects/strong-Oracle
@ ./~/knex/lib/dialects/strong-Oracle/index.js 15:9-33```
``````

Komentar yang paling membantu

juga mengalami ini. apa yang berhasil untuk saya;

externals: {
  knex: 'commonjs knex'
}

Semua 23 komentar

Saya mengalami masalah ini, tetapi menambahkan Regex ke eksternal saya di konfigurasi webpack saya memperbaikinya:

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 Mengabaikan direktori node_modules tidak benar-benar menyelesaikan masalah, kami hanya mengatasi masalah tersebut. Akan luar biasa jika kode akan melakukan ini dengan cara yang lebih cerdas yang tidak menimbulkan kesalahan.

Juga mengalami ini. Tidak yakin mengapa mengabaikan node_modules tidak berfungsi.

juga mengalami ini. apa yang berhasil untuk saya;

externals: {
  knex: 'commonjs knex'
}

Saya tidak dapat berkomentar secara khusus tentang masalah mariasql tetapi yang memecahkan masalah saya adalah mendefinisikan semua driver yang tidak saya gunakan sebagai eksternal. Misalnya, saya menggunakan driver mysql2 untuk proyek saya, jadi saya memiliki ini di eksternal:

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

Hasilnya adalah knex dibundel tanpa kesalahan atau peringatan

Masalah ini sepertinya hanya masalah bagaimana mengatur konfigurasi webpack ketika memasukkan knex ... mari kita buka kembali jika ada perubahan yang diperlukan di knex untuk mendukung webpack dengan lebih baik.

Sebenarnya, saya rasa masalahnya belum selesai, masih ada masalah yang belum terselesaikan dengan webpack, dengan migrasi dan 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

Saya tidak bisa memperbaiki ini

@ifullgaz yang sepertinya bukan kesalahan, tetapi hanya peringatan bahwa require() tidak digunakan dengan string literal? https://github.com/webpack/webpack/issues/196

@ifullgaz , saya sudah mencoba solusi Anda, tetapi saya mendapatkan kesalahan seperti di bawah ini. Apakah Anda mengalami masalah serupa?

  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 sudahkah Anda memperbaiki kepemilikan dll. ke direktori node_modules dan semua konten ist (Anda belum menjalankan npm install sebagai root kapan saja)?

     [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 Saya menemukan saran dari https://www.laurivan.com/make-electron-work-with-knex-js/ memperbaiki kesalahan ini:

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

Secara khusus, bagian ini bekerja untuk saya:

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

ini tiket untuk saya libraryTarget: 'commonjs2',

Saya melihat pendekatan yang sedikit berbeda yang memungkinkan webpack memproses sebagian besar pernyataan require dalam file knex, tetapi akan membiarkan require non-literal saja sehingga file migrasi dan seed disediakan oleh pengguna perpustakaan dapat ditemukan. Inilah pendekatan yang saya ambil:

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

Hai teman-teman, saya sedang bekerja untuk memecahkan masalah membuat bundel webpack lengkap untuk layanan menggunakan knex dan mengalami masalah ini ketika mencoba menjalankan migrasi secara terprogram dari bundel itu. Saran @mdlavin memang membuatnya menjalankan persyaratan tetapi, itu mengakibatkan webpack tidak mengubah file sumber. Itu juga berarti saya harus memasukkan direktori itu dengan bundel di luar pita dari bundel webpack.

Saya menemukan bahwa Anda dapat menggunakan ContextReplacementPlugin webpack untuk menyelesaikan masalah dengan migrasi dan seed. Di bawah ini adalah contoh dari konfigurasi saya (ditulis dalam TypeScript):

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

Dalam konfigurasi saya params.targetPackageFiletPath adalah jalur yang diselesaikan ke paket yang sedang dikompilasi misalnya /Users/yourusername/yourproject . Jadi jika sebuah proyek di jalur itu memiliki direktori migrations dan seeds , konfigurasi plugin yang dihasilkan akan terlihat seperti ini:

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

Untuk menguraikannya sedikit, masalahnya adalah bahwa migrasi knex dan kode seed memanggil require untuk memuat migrasi dan seed Anda, seperti yang terjadi di sini https://github.com/tgriesser/knex/blob/master/ src/migrasi/index.js#L54. Ini melewati hasil dari fungsi/ekspresi yang diperlukan tanpa awalan atau akhiran string yang dikodekan dengan keras, jadi, ketika webpack mencoba mencari tahu file apa yang mungkin benar-benar dimuat, itu tidak memiliki informasi yang cukup untuk menentukannya. Plugin ini menyediakan informasi yang diperlukan untuk webpack.

Saya tidak yakin apakah Knex dapat diubah untuk membuat ini tidak perlu saat digabungkan dengan webpack. Mungkin dengan melakukan kebutuhan di user-land?

Bagaimanapun, saya pikir saya akan membagikan solusi yang berhasil untuk saya.

Adakah saran untuk masalah ini di Angular?
Saya mencoba menggunakan proyek ekspres, itu normal (tidak menunjukkan kesalahan). Tetapi ketika saya menggunakannya dalam proyek Angular, itu menunjukkan kesalahan:

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'

di mana saya dapat melakukan konfigurasi untuk menghapus kesalahan ini?
dapatkah itu diatur pada file angular.json atau tsconfig.json ?

Di webpack kemungkinan besar.

Ini memperbaikinya untuk saya (kredit ke @ifullgaz ) Saya harus menambahkan 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'
    }

Kemudian hapus saja driver yang Anda gunakan dari daftar ini dan webpack akan memasukkannya ke dalam file build.

@ifullgaz Saya menemukan saran dari https://www.laurivan.com/make-electron-work-with-knex-js/ memperbaiki kesalahan ini:

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

Secara khusus, bagian ini bekerja untuk saya:

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

Ini bekerja sangat baik untuk saya. Saya melakukan ini:

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) Saya tidak dapat membuat impor relatif noop.js berfungsi karena ia mencoba mengimpornya jauh di dalam knex. Saya baru saja menginstal lib node-noop sederhana ini dan itu berfungsi dengan baik.
2) Kami menggunakan Postgres, jadi regex di baris pertama cocok dengan semua yang lain yang dicarinya. Ubah sesuka hati Anda.

2019/10 Saya berhasil membuatnya berfungsi, lihat jawaban saya di edisi lain https://github.com/tgriesser/knex/issues/1446#issuecomment 537715431

Saya menempatkan ketergantungan pg sebagai "eksternal" dan itu memecahkan masalah terima kasih banyak, apakah itu berarti webpack mem-parsing dependensi back-end?

Hai teman-teman, saya sedang bekerja untuk memecahkan masalah membuat bundel webpack lengkap untuk layanan menggunakan knex dan mengalami masalah ini ketika mencoba menjalankan migrasi secara terprogram dari bundel itu. Saran @mdlavin memang membuatnya menjalankan persyaratan tetapi, itu mengakibatkan webpack tidak mengubah file sumber. Itu juga berarti saya harus memasukkan direktori itu dengan bundel di luar pita dari bundel webpack.

Saya menemukan bahwa Anda dapat menggunakan ContextReplacementPlugin webpack untuk menyelesaikan masalah dengan migrasi dan seed. Di bawah ini adalah contoh dari konfigurasi saya (ditulis dalam TypeScript):

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

Dalam konfigurasi saya params.targetPackageFiletPath adalah jalur yang diselesaikan ke paket yang sedang dikompilasi misalnya /Users/yourusername/yourproject . Jadi jika sebuah proyek di jalur itu memiliki direktori migrations dan seeds , konfigurasi plugin yang dihasilkan akan terlihat seperti ini:

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

Untuk menguraikannya sedikit, masalahnya adalah bahwa migrasi knex dan kode seed memanggil require untuk memuat migrasi dan seed Anda, seperti yang terjadi di sini https://github.com/tgriesser/knex/blob/master/ src/migrasi/index.js#L54. Ini melewati hasil dari fungsi/ekspresi yang diperlukan tanpa awalan atau akhiran string yang dikodekan dengan keras, jadi, ketika webpack mencoba mencari tahu file apa yang mungkin benar-benar dimuat, itu tidak memiliki informasi yang cukup untuk menentukannya. Plugin ini menyediakan informasi yang diperlukan untuk webpack.

Saya tidak yakin apakah Knex dapat diubah untuk membuat ini tidak perlu saat digabungkan dengan webpack. Mungkin dengan melakukan kebutuhan di user-land?

Bagaimanapun, saya pikir saya akan membagikan solusi yang berhasil untuk saya.

Selamatkan hari-hariku, terima kasih banyak.

Bagi mereka yang mencari solusi, yang ini bekerja untuk saya menggunakan knex@^0.21.1, saya ingin driver mysql2 dipertahankan. Saya mengambil 2 solusi yang ada, yang bekerja bersama untuk saya.

Dalam konfigurasi webpack, gabungkan dalam versi modifikasi 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',
      }

Juga tambahkan plugin webpack, yang akan mengecualikan paket yang menyinggung
ref https://github.com/knex/knex/issues/3130#issuecomment -573293311

Saya memodifikasi yang asli untuk mengecualikan dengan benar dalam kasus penggunaan saya, termasuk set sub-dir mssql yang benar & juga untuk memungkinkan beberapa paket pg yang diperlukan agar Knex berfungsi

    new webpack.IgnorePlugin(
        new RegExp('^(mssql*|mariasql|.oracle.|sqlite3|mssql/.*|tedious|node-pre-gyp)$')
      ),
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

mattgrande picture mattgrande  ·  3Komentar

legomind picture legomind  ·  3Komentar

npow picture npow  ·  3Komentar

marianomerlo picture marianomerlo  ·  3Komentar

tjwebb picture tjwebb  ·  3Komentar