我想知道Sequelize是否有可能创建所需的模型,然后根据从请求接收的值使用一个模型。我尝试了不同的方法来实现此目的,但没有找到可行的解决方案。我接受它可能不存在。但是,如果是这样,是否有人对如何实现这一目标有想法?
const express = require('express');
const router = express.Router();
const Models = require('../models');
...
for (let modelName in tablesObj) {
if (modelName == primaryTable) {
Models.modelName.findAll()
.then(results => {
console.log(result);
});
}
}
答案 0 :(得分:0)
执行此操作的最佳方法是在/models
目录的加载器中。它可以导出由模型名称作为关键字的Models
对象。
models / index.js
const fs = require('fs');
const path = require('path');
const sequelize = // your db connection
// object to hold all the models to export
const models = {};
// Read all the files from this dir and load the models
fs.readdirSync(__dirname)
.forEach((file) => {
if (file !== path.basename(__filename) && file.endsWith('.js')) {
const model = sequelize.import(
path.join(__dirname, '/', file.replace(/\.js$/, ''))
);
models[model.name] = model;
}
});
/* anything else you want to do goes here */
// export the models
module.exports = models;
现在,您可以加载models
,然后按名称访问每个。
other.js
const models = require('../models');
async function runQuery() {
// access "modelName" model
const result = await models.modelName.findByPk(1);
// rest of your method
}
我通常会更进一步,将models
加载到创建Express应用程序的文件中,然后将模型设置为app
上的属性,然后将其传递给路由器。
server.js
const Express = require('express');
const models = require('./models');
const app = new Express();
app.model = (model) => models[model];
现在您可以像这样访问模型了:
// assuming the model name is "Widget"
const widget = await app.models('Widget').findOne(...);
答案 1 :(得分:0)
对我来说,不需要添加/修改index.js
文件。默认情况下,index.js
已存在于models文件夹中。
在代码works for me!!
下,
const models = require("../../models");
let modeName, runningModel;
router.get('/api/:module', (req, res) => {
modelName = (req.params.module)
runningModel = models[modelName];
runningModel.findAndCountAll({
//your code goes here
})
.then(resutls => res.json(results)
.catch(err => res.json(err);
}
以下是我的项目中使用的软件包和版本
"express": "^4.17.1",
"morgan": "^1.10.0",
"pg": "^8.2.1",
"sequelize": "^5.21.4",
"sequelize-cli": "^5.5.1"