【问题标题】:Sequelize: create is not a function when model is generated from migrationSequelize:从迁移生成模型时,create 不是函数
【发布时间】:2020-05-29 21:32:59
【问题描述】:

我从 sequelize CLI 创建了这个模型

models/society.js

'use strict';
module.exports = (sequelize, DataTypes) => {
  const Society = sequelize.define('Society', {
    code: DataTypes.STRING,
    name: DataTypes.STRING,
    description: DataTypes.STRING
  }, {});
  Society.associate = function(models) {
    // associations can be defined here
  };
  return Society;
};

那么这是我的 index.js 配置文件

'use strict'

const express = require('express')
const bodyParser = require('body-parser')
const app = express()
const api = require('./routes')

app.use(bodyParser.urlencoded({extended: false}))
app.use(bodyParser.json())
app.use('/api', api)

const port = process.env.PORT || 3000


app.listen(port, ()=>{
    console.log(`API REST running on http://localhost:${port}`)
})

路线部分是这里

routes/index.js

'use strict'

const express = require('express')
const api = express.Router()

const SocietyCtrl = require('../controllers/society')
api.post('/society', SocietyCtrl.createSociety)

module.exports = api

最后它只是控制器 controllers/society.js

'use strict'

const Society = require('../models/society')

function createSociety(req, res){
    console.log('POST /api/society/')
    Society.create(req.body).then(created =>{
        res.status(200).send({society: created})
    })
}

module.exports = {
    createSociety
}

当我尝试进行 POST 时出现问题,我收到以下错误:

Society.create 不是函数

你能告诉我我做错了什么吗?

【问题讨论】:

  • 你试过 Society.Society.create() 吗?
  • 您可以使用console.log(Society.create) 来检查它是什么。确保您的模型组织正确。
  • 因为 models/society.js 返回一个函数
  • 这能回答你的问题吗? sequelize .create is not a function error

标签: javascript node.js sequelize.js


【解决方案1】:

此问题与迁移无关,但是要解决此问题,您必须执行两个步骤:

1) 在名为index.jsmodels 目录中添加新文件,其中包含以下代码

注意:确保编辑 sequelize 配置(使用您的环境),该配置从 9 行开始并在下面文件中的 13 行结束 (models/index.js)

'use strict';

const Sequelize = require('sequelize');
const fs = require('fs');
const path = require('path');
const basename = path.basename(__filename);

const db = {};

const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  port: 3066,
  dialect: /* one of 'mysql' | 'mariadb' | 'postgres' | 'mssql' */
});

fs.readdirSync(__dirname).filter(file => {
  return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
}).forEach(file => {
  const model = sequelize['import'](path.join(__dirname, file));
  db[model.name] = model;
});

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

module.exports = db;

2)controllers/society.js 文件中执行以下操作

  • const Society = require('../models/society'); 替换为const db = require('../models/index');const db = require('../models');
  • Society.create 替换为db.Society.create

像这样:

'use strict'

const db = require('../models');

function createSociety(req, res){
    console.log('POST /api/society/');
    db.Society.create(req.body).then(created =>{
        res.status(200).send({society: created})
    });
}

module.exports = {
    createSociety
}

要了解更多信息,我建议您查看由官方 sequelize team 开发的名为 express-example 的 github 存储库

【讨论】:

    【解决方案2】:

    感谢阿姆杰德! 但我不需要将 index.js 添加到 models 目录,因为 sequelize 已经这样做了。 但是我需要做的就是:

    'use strict'
    
    const db = require('../models/index')
    const Society = db.Society
    
    

    然后它按预期工作。

    【讨论】:

      猜你喜欢
      • 2020-02-01
      • 2021-03-17
      • 2015-03-06
      • 2018-07-30
      • 1970-01-01
      • 2016-09-27
      • 2020-11-09
      • 2018-07-14
      • 2016-01-23
      相关资源
      最近更新 更多