Sequelize Associate Objects失败,没有addX方法

时间:2013-04-04 17:32:59

标签: node.js sequelize.js

尝试将电话号码与用户关联会导致节点告诉我User对象没有方法addPhonenumber。 (也可以使用setPhonenumber)

req.user.setPhonenumbers(phonenumber).success(function(user){
             ^
TypeError: Object [object Object] has no method 'setPhonenumbers'

如何正确关联对象?代码如下。

models.js中的对象定义:

exports.User = require("./user")(sequelize, Sequelize);
exports.Phonenumber = require("./phonenumber")(sequelize, Sequelize);
exports.Recording = require("./recording")(sequelize, Sequelize);
exports.Call = require("./call")(sequelize, Sequelize);

User
  .hasMany(Phonenumber)
  .hasMany(Recording);

Phonenumber
  .belongsTo(User)
  .hasOne(Recording)
  .hasMany(Call);

Recording.belongsTo(User);

Call.belongsTo(Phonenumber);

尝试设置关联:

      var phonenumber = yp.db.Phonenumber.create({
        number: number.phone_number
      }).success(function(number){
        console.log(number);
        console.log(req.user);
        req.user.setPhonenumbers(phonenumber).success(function(user){
          console.log(user);
        });
      });

以上引用的req.user:

的console.log结果
{ __options: 
   { timestamps: true,
     instanceMethods: { fullname: [Function] },
     classMethods: {},
     validate: {},
     freezeTableName: false,
     underscored: false,
     syncOnAssociation: true,
     paranoid: true,
     omitNull: false,
     hasPrimaryKeys: false },
  hasPrimaryKeys: false,
  selectedValues: 
   { firstname: 'Nathan',
     lastname: 'Loyer',
     email: 'xxx@gmail.com',
     password: '****',
     facebookid: '****',
     id: 2,
     createdAt: Thu Feb 28 2013 20:40:29 GMT-0600 (CST),
     updatedAt: Wed Mar 06 2013 20:22:05 GMT-0600 (CST),
     deletedAt: null },
  firstname: 'Nathan',
  lastname: 'Loyer',
  email: 'xxx@gmail.com',
  password: '****',
  facebookid: '****',
  id: 2,
  createdAt: Thu Feb 28 2013 20:40:29 GMT-0600 (CST),
  updatedAt: Wed Mar 06 2013 20:22:05 GMT-0600 (CST),
  deletedAt: null,
  isNewRecord: false }

我错过了什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

您的每个hasMany都需要匹配的belongsTo。并且,相关的函数将是setPhonenumbers。请参阅:http://www.sequelizejs.com/documentation#associations-associating-objects

答案 1 :(得分:0)

事实证明,我的命名不够严格。在phonenumber模型的模型定义中,我使用Number而不是Phonenumber。

module.exports = function(sequelize, Sequelize){

  return sequelize.define('Number',{
    number: Sequelize.STRING,
  },{
    paranoid: true
  });

}

因此它创建了一个setNumbers函数,而不是setPhonenumbers函数。将此更改为Phonenumber并重新创建表使上述代码几乎可以正常工作。 setPhonenumbers似乎想要一个数组,所以我使用了addPhonenumber。