Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 网页包+;Sequelize:从文件导入模型定义_Node.js_Webpack_Sequelize.js_Serverless Framework - Fatal编程技术网

Node.js 网页包+;Sequelize:从文件导入模型定义

Node.js 网页包+;Sequelize:从文件导入模型定义,node.js,webpack,sequelize.js,serverless-framework,Node.js,Webpack,Sequelize.js,Serverless Framework,我在一个无服务器项目中使用Sequelize,该项目使用Webpack将函数文件捆绑到单个脚本中 我有一个models文件夹,其中包含模型定义: models/ExampleModel.js import { DataTypes, Model } from 'sequelize'; module.exports = sequelize => { class ExampleModel extends Model { static associate(models) {

我在一个无服务器项目中使用Sequelize,该项目使用Webpack将函数文件捆绑到单个脚本中

我有一个
models
文件夹,其中包含模型定义:

models/ExampleModel.js

import { DataTypes, Model } from 'sequelize';

module.exports = sequelize => {
  class ExampleModel extends Model {
    static associate(models) {
      // handle associations
    }
  }

  ExampleModel.init({
    id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      primaryKey: true,
    },
    ...
  }, {
    sequelize,
  });

  return ExampleModel;
}
然后我有一个
models/index.js
文件,其中包含一个加载程序,用于导入这些文件并调用
associate
函数来设置关联:

import fs from 'fs';
import path from 'path';
import { Sequelize } from 'sequelize';

const sequelize = new Sequelize(process.env.DB_URL);
const base = path.resolve('src/models')
const db = {};

fs
  .readdirSync(base)
  .filter((file) => {
    console.log(file)
    const returnFile = (file.indexOf('.') !== 0)
      && (file !== 'index.js')
      && (file.slice(-3) === '.js');
    return returnFile;
  })
  .forEach((file) => {
    const filepath = path.join(base, file);
    const model = require(filepath)(sequelize)
    db[model.name] = model;
  });


Object.keys(db).forEach((modelName) => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

export default db;
问题在于,此函数显然是在运行时执行的(当您尝试导入模型时),因此Webpack无法识别模型文件是必需的,并且未将其包含在生成中

为了解决这个问题,我尝试将以下内容添加到我的网页配置中:

plugins: [
  new CopyWebpackPlugin({
    patterns: [
      { from: 'src/shared/v3/models', to: 'src/models' },
    ]
  }),
  ...
]
当我查看Webpack的输出时,它已成功地将models目录复制到
src/models

.webpack/test-models
└── src
    ├── models
    │   ├── ExampleModel.js
    │   └── index.js
    └── scripts
        ├── test-models.js
        └── test-models.js.map
但是,当运行
testmodels.js
时,它会失败,并出现以下错误:

错误:找不到模块“/Users/redact/.webpack/test models/src/models/ExampleModel.js”

index.js的filter函数中的
console.log
成功地记录了所有模型文件名,并且这些文件都存在,因此我无法找出
require
调用找不到文件的原因

成功运行以下命令将在错误消息中列出文件的内容:

$ cat /Users/redacted/.webpack/test-models/src/models/ExampleModel.js
import { DataTypes, Model } from 'sequelize';

module.exports = sequelize => {
  class ExampleModel extends Model {
  ...

我已经检查了复制文件的权限,它们都是
-rw-r--r--
,因此脚本应该可以读取。

您找到解决方案了吗?我也遇到了同样的问题。我最终只是编写了一个快速的独立脚本来获取目录列表,构建一个
index.js
,它分别导入每个文件(硬编码),然后导出,并将其添加到构建管道中