【问题标题】:NodeJS Sequelize - Cannot read property '_isSequelizeMethod' of undefinedNodeJS Sequelize - 无法读取未定义的属性“_isSequelizeMethod”
【发布时间】:2017-06-17 12:09:11
【问题描述】:

我有一个使用 Express 的 NodeJS 服务器。 对于我的数据库,我使用 Sequelize,并且我在 Sequelize 文档中定义了我的模型:

模型/index.js

"use strict";

var fs        = require("fs");
var path      = require("path");
var Sequelize = require("sequelize");

var sequelize = new Sequelize('mydb', 'root', '', {
  host: 'localhost',
  dialect: 'mysql',

  pool: {
    max: 5,
    min: 0,
    idle: 10000
  }
});
var db        = {};

fs
  .readdirSync(__dirname)
  .filter(function(file) {
    return (file.indexOf(".") !== 0) && (file !== "index.js");
  })
  .forEach(function(file) {
    var model = sequelize.import(path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(function(modelName) {
  if ("associate" in db[modelName]) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

models/server.js

"use strict";

module.exports = function(sequelize, DataTypes) {
  var Server = sequelize.define('Server', {
    id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        unique: true,
        allowNull: false
    },
    reference: DataTypes.STRING,
    name: DataTypes.STRING
  },
  {
    timestamps: false,
    paranoid: false,
    underscored: true,
    freezeTableName: true,
    tableName: 'server'
  });

  return Server;
};

models/subscriber.js

"use strict";

module.exports = function(sequelize, DataTypes) {
  var Subscriber = sequelize.define('Subscriber', {
    id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        unique: true,
        allowNull: false
    },
    type: {
      type: DataTypes.ENUM,
      values: ['email', 'phone']
    },
    contact: DataTypes.STRING,
    server_id: DataTypes.INTEGER,
    notified: DataTypes.INTEGER,
    last_notified: DataTypes.DATE
  },
  {
    timestamps: false,
    paranoid: false,
    underscored: true,
    freezeTableName: true,
    tableName: 'subscriber',
    classMethods: {
      associate: function(models) {
        Subscriber.belongsTo(models.Server, { foreignKey: 'server_id', targetKey: 'id' });
      }
    }
  });

  return Subscriber;
};

这里是我的路线:

var models  = require('../models');

app.get('/subscribe/:type/:contact/:ref', function(req, res) {
        var type = req.params.type;
        var contact = req.params.contact;
        var ref = req.params.ref;

        models.Subscriber.findAll().then(function(result) {
            console.log(result);
        });

        res.render('full/subscribed.twig', {
            type: type,
            contact: contact,
            server : server
        });
    });

当我访问我的路线时,我收到以下错误消息:

Unhandled rejection TypeError: Cannot read property '_isSequelizeMethod' of undefined
at /Users/me/Projects/nodejs/myproject/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1077:20
at Array.map (native)
at Object.QueryGenerator.selectQuery (/Users/me/Projects/nodejs/myproject/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1067:55)
at QueryInterface.select (/Users/me/Projects/nodejs/myproject/node_modules/sequelize/lib/query-interface.js:669:25)
at null.<anonymous> (/Users/me/Projects/nodejs/myproject/node_modules/sequelize/lib/model.js:1398:32)
at tryCatcher (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/promise.js:510:31)
at Promise._settlePromise (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/promise.js:567:18)
at Promise._settlePromise0 (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/promise.js:612:10)
at Promise._settlePromises (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/promise.js:691:18)
at Async._drainQueue (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/async.js:133:16)
at Async._drainQueues (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/async.js:143:10)
at Immediate.Async.drainQueues [as _onImmediate] (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/async.js:17:14)
at processImmediate [as _immediateCallback] (timers.js:383:17)

我尝试在一个独立的 NodeJS 文件上做一些体验,一切正常,我只是启动了我的独立 js 文件,并对数据库进行了一些操作,一切都很好。当我在我的 Express 路线上做完全相同的事情时,我遇到了这个错误......

有人知道为什么吗?

提前致谢, 史蒂夫

【问题讨论】:

    标签: javascript node.js express sequelize.js


    【解决方案1】:

    好的,找到了:

    这是因为我在对象原型中添加了一些功能......

    如果您的对象原型上有一些自定义函数,那么当 sequelize 获取模型选项的对象时,它会失败...

    在 node_modules/sequelize/lib/dialects/abstract/query-generator.js 上(第 1067 行)

    mainAttributes = mainAttributes && mainAttributes.map(function(attr) {
    

    mainAttributes 包含我的自定义函数:

    [ 'id',
      'reference',
      'name',
      [ undefined, 'join' ],
      [ undefined, 'getKeyByValue' ] ]
    

    我添加到 Object 的函数是 join 和 getKeyByValue。

    所以总结一下,当你使用 Sequelize 时,不要在 Object.prototype 中添加自定义函数;)

    希望对其他人有所帮助。

    【讨论】:

    • 抱歉,但无法理解您要传达的内容..您能否详细说明我必须在哪里进行更改以消除此错误。我面临着完全相同的堆栈跟踪的类似问题
    • 嗨 Amritpal,在我的代码中我有类似“Object.prototype.join = function(){};”的内容这条线产生了我的错误。尝试 console.log node_modules/sequelize/lib/dialects/abstract/query-generator.js(第 1067 行)变量“mainAttributes”,你会看到。
    【解决方案2】:

    当您导入表时,它已经添加到sequelize.models 数组中,因此您无需再次显式添加。 sequelize 文档需要更新为以下内容:

    readdirSync(__dirname)
    .filter(file => (file.indexOf('.') !== 0) && (file !== 'index.js'))
    .forEach(file => {
        sequelize.import(path.join(__dirname, file))
    })
    
    Object
    .keys(sequelize.models)
    .forEach(modelName => {
        if ('associate' in sequelize.models[modelName]) {
            sequelize.models[modelName].associate(sequelize.models)
        }
    })
    

    【讨论】:

      猜你喜欢
      • 2016-01-10
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2020-09-14
      • 2017-10-19
      • 2016-09-05
      • 2017-03-06
      • 2021-12-23
      相关资源
      最近更新 更多