Node.js 网页包+;Sequelize:从文件导入模型定义
我在一个无服务器项目中使用Sequelize,该项目使用Webpack将函数文件捆绑到单个脚本中 我有一个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) {
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
,它分别导入每个文件(硬编码),然后导出,并将其添加到构建管道中