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```
``````
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 direktorimigrations
danseeds
, 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)$')
),
Komentar yang paling membantu
juga mengalami ini. apa yang berhasil untuk saya;