【问题标题】:sequelize .create is not a function errorsequelize .create 不是函数错误
【发布时间】:2016-01-23 15:40:10
【问题描述】:

我收到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
});

路由/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);
    });
});

【问题讨论】:

    标签: node.js express sequelize.js


    【解决方案1】:

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

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

    像这样:

    模型/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);
    });
    

    模型/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;

    希望这会有所帮助。

    【讨论】:

    • 我已经关注这个我收到错误Cannot read property 'all' of undefined
    【解决方案2】:

    随便用

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

    【讨论】:

      【解决方案3】:

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

      Sequelize create not a function?

      【讨论】:

        【解决方案4】:

        更新:

        在较新版本的 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 文件中导入用户模型,它可以是任何文件

        控制器/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 small 'S') 是不同的 东西,第一个代表使用 new Sequelize 创建的 Sequelize 实例,第二个只是您安装和导入的软件包

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

        导出续集实例

        db.jsapp.js

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

        【讨论】:

          猜你喜欢
          • 2018-07-30
          • 2018-09-09
          • 2020-10-06
          • 2019-06-08
          • 2020-05-29
          • 2018-09-29
          • 2020-07-01
          • 1970-01-01
          • 2021-12-04
          相关资源
          最近更新 更多