sequelize .create is not a function 错误

sequelize .create is not a function error

我收到 Unhandled rejection TypeError: feed.create is not a function 错误,我不明白为什么会这样。这里有什么问题?

这是我的代码。我可能没有在这里做一些非常基础的事情,因为我无法在 routes/index.js.

中访问 feed 变量

如果我添加 module.exports = feed;到我的模型文件,我可以访问它,但我有多个模型,所以如果我在提要下面添加其他模型,它们会覆盖它。

db.js

var Sequelize = require('sequelize');
var sequelize = new Sequelize('mydatabase', 'root', 'root', {
    host: 'localhost',
    dialect: 'mysql',
    port: 8889,

    pool: {
        max: 5,
        min: 0,
        idle: 10000
    },
    define: {
        timestamps: false
    }
});

var db = {};
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;

models.js

var db = require('./db'),
    sequelize = db.sequelize,
    Sequelize = db.Sequelize;

var feed = sequelize.define('feeds', {
    subscriber_id: Sequelize.INTEGER,
    activity_id: Sequelize.INTEGER
},
{
    tableName: 'feeds',
    freezeTableName: true
});

routes/index.js

var express = require('express');
var router = express.Router();
var models = require('../models');

router.get('/addfeed', function(req,res) {
    sequelize.sync().then(function () {
        return feed.create({
            subscriber_id: 5008,
            activity_id : 116
        });
    }).then(function (jane) {
        res.sendStatus(jane);
    });
});

您无法从一个文件中访问变量,而只能在另一个文件中请求它。您需要定义一个对象文字来将所有变量保存在一个地方并将其分配给 module.exports,或者您需要分别从不同的文件导入它们。

在你的情况下,我会创建单独的文件来保存 table 模式,然后通过 sequelize.import 将它们导入到一个文件下,然后需要该文件。

像这样:

models/index.js:

var sequelize = new Sequelize('DBNAME', 'root', 'root', { 
  host: "localhost",           
  dialect: 'sqlite',           

  pool:{
    max: 5, 
    min: 0,
    idle: 10000                
  },

  storage: "SOME_DB_PATH"
}); 

// load models                 
var models = [                 
  'Users',            
];
models.forEach(function(model) {
  module.exports[model] = sequelize.import(__dirname + '/' + model);
});

models/Users.js

var Sequelize = require("sequelize");

module.exports=function(sequelize, DataTypes){ 
  return Users = sequelize.define("Users", {
    id: {
      type: DataTypes.INTEGER, 
      field: "id",             
      autoIncrement: !0,       
      primaryKey: !0
    },
    firstName: {               
      type: DataTypes.STRING,  
      field: "first_name"      
    },
    lastName: {                
      type: DataTypes.STRING,  
      field: "last_name"       
    },
  }, {
    freezeTableName: true, // Model tableName will be the same as the model name
    classMethods:{

      }
    },
    instanceMethods:{

      }
    }
  });
};

然后像这样导入每个模型:

var Users = require("MODELS_FOLDER_PATH").Users;

希望对您有所帮助。

您可能想查看下面 link 上给出的解决相同问题的答案,我能够使用 const User = sequelize.import('../models/users'); 解决我的问题,而不仅仅是 import User from '../models/users';

就用

const { User } = require("../models");

更新:

在较新版本的 sequelize v6 及更高版本 sequelize.import 中已弃用

sequelize docs 建议现在使用 require

如果您使用迁移生成了模型

这就是您的模型文件的样子

models/user.js

'use strict'
module.exports = (sequelize, DataTypes, Model) => {
    class User extends Model {
        /**
         * Helper method for defining associations.
         * This method is not a part of Sequelize lifecycle.
         * The `models/index` file will call this method automatically.
         */
        static associate(models) {
            // define association here
        }
    };
    User.init({
        name: {
            type: DataTypes.STRING,
            allowNull: false
        },
        phone_number: {
            type: DataTypes.STRING(20)
        },
        otp: {
            type: DataTypes.INTEGER(4).UNSIGNED
        },{
        sequelize,
        modelName: 'User',
    });
    return User;
};

如您所见,您的模型导出函数具有 sequelize DataTypesModel 参数。

所以当你导入这个模型时你应该发送上面的参数。

例子

我正在 controllers/user.js 文件中导入用户模型,它可以是任何文件

controllers/controller.js

const Sequelize = require('sequelize');
const sequelize = require('../config/db').sequelize;

// Bring in Model
const User = require('../models/user')(sequelize, Sequelize.DataTypes,
     Sequelize.Model);
// your code...
// User.create(), User.find() whatever

注意sequelize(with small 's')和Sequelize(with capital 'S') 是不同的东西,第一个表示使用新的 Sequelize 创建的 Sequelize 实例,第二个只是您安装和导入的包

第一个 (sequelize) 可以在您使用 const sequelize = new Sequelize() 开始连接到数据库的任何地方找到,通常来自 app.js 或 db.js 文件,确保导出它从那里导入它到你想使用模型的地方,即控制器

导出续集实例

db.jsapp.js

const sequelize = new Sequelize();
... //your code
...
module.exports = {
sequelize: sequelize
}