Knex: أخطاء "الوحدة غير موجودة" عند استخدام knex مع حزمة الويب

تم إنشاؤها على ٦ يناير ٢٠١٦  ·  23تعليقات  ·  مصدر: knex/knex

أحاول استخدام knex في مشروع أعمل عليه. المشكلة التي أواجهها هي أنه عندما أحاول تشغيل webpack ، فإنه يتتبع المتطلبات ويحاول جذب برامج التشغيل / اللهجات التي لا أستخدمها ولم يتم تثبيتها.

أي أفكار حول كيفية حل هذا؟

"" "" سجل
خطأ في ./~/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
الوحدة غير موجودة: خطأ: لا يمكن حل الوحدة النمطية "oracle" في ~ / 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 كومينتر

واجهت هذه المشكلة ، ولكن إضافة Regex إلى العناصر الخارجية الخاصة بي في تكوين حزمة الويب الخاصة بي تم إصلاحه:

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 الذي لا يبدو أنه خطأ ، ولكن مجرد تحذير يتطلب () لم يستخدم مع سلسلة حرفية؟ 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 وجميع محتويات IST (لم تقم بتشغيل تثبيت npm كجذر في أي لحظة)؟

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

لقد بحثت عن نهج مختلف قليلاً يسمح لـ webpack بمعالجة معظم كشوفات الحساب 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'
    }
  }
];

مرحبًا يا رفاق ، كنت أعمل على حل مشكلة إنشاء حزمة webpack كاملة لخدمة باستخدام knex وواجهت هذه المشكلة عند محاولة تشغيل عمليات الترحيل برمجيًا من تلك الحزمة. لقد أدى اقتراح mdlavin إلى تشغيله طلبًا ، ولكنه أدى إلى عدم قيام حزمة الويب بتحويل الملف المصدر. هذا يعني أيضًا أنني سأحتاج إلى تضمين هذا الدليل مع الحزمة خارج النطاق من حزمة webpack.

اكتشفت أنه يمكنك استخدام webpack's 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 / migrate / index.js # L54. إنها تمرر نتيجة دالة / تعبير لتتطلبه بدون بادئة أو لاحقة سلسلة مشفرة ، لذلك عندما يحاول webpack اكتشاف الملفات التي قد يتم تحميلها بالفعل ، فإنه لا يحتوي على معلومات كافية لتحديد ذلك. توفر هذه المكونات الإضافية المعلومات المطلوبة لحزمة الويب.

لست متأكدًا مما إذا كان من الممكن تغيير Knex لجعل هذه الأشياء غير ضرورية عند تجميعها مع حزمة الويب. ربما عن طريق القيام بالمطلوبات في أرض المستخدم؟

على أي حال ، أعتقد أنني سأشارك حلًا يناسبني.

أي اقتراح لهذه المسألة في 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 lib وقد عمل بشكل جيد.
2) نستخدم Postgres ، لذا فإن التعبير المعتاد في السطر الأول يطابق كل ما يبحث عنه. تعديل على محتوى قلبك.

2019/10 تمكنت من تشغيله ، راجع إجابتي في عدد آخر https://github.com/tgriesser/knex/issues/1446#issuecomment -537715431

أضع تبعية pg على أنها "خارجية" وقد تم حل المشكلة بفضل الكثير ، فهل هذا يعني أن webpack يحلل تبعيات النهاية الخلفية؟

مرحبًا يا رفاق ، كنت أعمل على حل مشكلة إنشاء حزمة webpack كاملة لخدمة باستخدام knex وواجهت هذه المشكلة عند محاولة تشغيل عمليات الترحيل برمجيًا من تلك الحزمة. لقد أدى اقتراح mdlavin إلى تشغيله طلبًا ، ولكنه أدى إلى عدم قيام حزمة الويب بتحويل الملف المصدر. هذا يعني أيضًا أنني سأحتاج إلى تضمين هذا الدليل مع الحزمة خارج النطاق من حزمة webpack.

اكتشفت أنه يمكنك استخدام webpack's 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 / migrate / index.js # L54. إنها تمرر نتيجة دالة / تعبير لتتطلبه بدون بادئة أو لاحقة سلسلة مشفرة ، لذلك عندما يحاول webpack اكتشاف الملفات التي قد يتم تحميلها بالفعل ، فإنه لا يحتوي على معلومات كافية لتحديد ذلك. توفر هذه المكونات الإضافية المعلومات المطلوبة لحزمة الويب.

لست متأكدًا مما إذا كان من الممكن تغيير Knex لجعل هذه الأشياء غير ضرورية عند تجميعها مع حزمة الويب. ربما عن طريق القيام بالمطلوبات في أرض المستخدم؟

على أي حال ، أعتقد أنني سأشارك حلًا يناسبني.

حفظ أيامي ، شكرا جزيلا.

بالنسبة لأولئك الذين يبحثون عن حل ، نجح هذا الحل بالنسبة لي باستخدام knex^0.21.1 ، كنت أرغب في الاحتفاظ بسائق mysql2 . لقد أخذت حلين موجودين ، وعملوا معًا من أجلي.

في webpack config ، قم بدمج نسخة معدلة من 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 sub-dirs وأيضًا للسماح لبعض حزم pg المطلوبة لعمل Knex

    new webpack.IgnorePlugin(
        new RegExp('^(mssql*|mariasql|.oracle.|sqlite3|mssql/.*|tedious|node-pre-gyp)$')
      ),
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

saurabhghewari picture saurabhghewari  ·  3تعليقات

aj0strow picture aj0strow  ·  3تعليقات

mtom55 picture mtom55  ·  3تعليقات

koskimas picture koskimas  ·  3تعليقات

marianomerlo picture marianomerlo  ·  3تعليقات