(序列化)动态使用模型按名称

时间:2019-04-03 14:10:18

标签: node.js sequelize.js

我想知道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);
    });
  }
}

2 个答案:

答案 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"