Node.js Sequelize有许多/belongtomany和instance方法
我正在使用SequelizeJS(版本2.0.0-rc6)和ExpressJS编写一个CRUD,用于管理系统中的用户。一个用户可以是多组用户,一组用户可以有多个用户。问题是,当我尝试将一个用户添加到一组用户时,sequelize抛出以下错误:Node.js Sequelize有许多/belongtomany和instance方法,node.js,postgresql,express,sequelize.js,Node.js,Postgresql,Express,Sequelize.js,我正在使用SequelizeJS(版本2.0.0-rc6)和ExpressJS编写一个CRUD,用于管理系统中的用户。一个用户可以是多组用户,一组用户可以有多个用户。问题是,当我尝试将一个用户添加到一组用户时,sequelize抛出以下错误: Possibly unhandled TypeError: Cannot call method 'replace' of undefined at Object.module.exports.removeTicks (/home/app/node_mod
Possibly unhandled TypeError: Cannot call method 'replace' of undefined
at Object.module.exports.removeTicks (/home/app/node_modules/sequelize/lib/utils.js:512:14)
at Object.module.exports.addTicks (/home/app/node_modules/sequelize/lib/utils.js:508:29)
at Object.module.exports.QueryGenerator.quoteIdentifier (/home/app/node_modules/sequelize/lib/dialects/postgres/query-generator.js:881:22)
at generateJoinQueries (/home/app/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1100:72)
at Object.<anonymous> (/home/app/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1165:29)
at Array.forEach (native)
at Object.module.exports.QueryGenerator.selectQuery (/home/app/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1164:25)
at module.exports.QueryInterface.select (/home/app/node_modules/sequelize/lib/query-interface.js:679:35)
at null.<anonymous> (/home/app/node_modules/sequelize/lib/model.js:728:34)
model/user.js
module.exports = function(sequelize, DataTypes) {
var UserGroup = sequelize.define("UserGroup", {
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
name: {
type: DataTypes.STRING(100),
allowNull: false
}
}, {
tableName: "user_group",
classMethods: {
associate: function(models) {
UserGroup.hasMany(models.User, {
through: "user_to_user_group"
});
}
}
});
return UserGroup;
};
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define("User", {
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
first_name: {
type: DataTypes.STRING(100),
allowNull: false
},
last_name: {
type: DataTypes.STRING(100),
allowNull: false
},
cpf: DataTypes.STRING(11),
rg: DataTypes.STRING(10),
birth_day: DataTypes.DATE,
password: {
type: DataTypes.STRING(100),
allowNull: false
},
active: {
type: DataTypes.BOOLEAN,
defaultValue: false
}
}, {
tableName: "user",
classMethods: {
associate: function(models) {
User.hasMany(models.Email);
User.hasMany(models.Phone);
User.hasMany(models.Address);
User.belongsToMany(models.UserGroup, {
through: "user_to_user_group"
});
}
},
});
return User;
};
router.post('/user/add', function(req, res, next) {
var data = req.body;
model.User.build(data.user)
.save()
.then(function(newUser){
async.map(data.user.user_group_ids, function(userGroupId, callback){
model.UserGroup.find({
where: {
id: userGroupId
}
})
.then(function(userGroup) {
// I'm getting here without any trouble
userGroup.addUser(newUser) // this line throws the error
.then(function(){
callback(null, userGroup);
});
});
}, function(error, userGroups){
if (!error) {
res.status(200).send('User created!');
} else {
res.status(500).send('Something bad happened!');
}
});
})
.catch(function(error){
console.log(error);
});
});
route/user.js
module.exports = function(sequelize, DataTypes) {
var UserGroup = sequelize.define("UserGroup", {
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
name: {
type: DataTypes.STRING(100),
allowNull: false
}
}, {
tableName: "user_group",
classMethods: {
associate: function(models) {
UserGroup.hasMany(models.User, {
through: "user_to_user_group"
});
}
}
});
return UserGroup;
};
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define("User", {
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
first_name: {
type: DataTypes.STRING(100),
allowNull: false
},
last_name: {
type: DataTypes.STRING(100),
allowNull: false
},
cpf: DataTypes.STRING(11),
rg: DataTypes.STRING(10),
birth_day: DataTypes.DATE,
password: {
type: DataTypes.STRING(100),
allowNull: false
},
active: {
type: DataTypes.BOOLEAN,
defaultValue: false
}
}, {
tableName: "user",
classMethods: {
associate: function(models) {
User.hasMany(models.Email);
User.hasMany(models.Phone);
User.hasMany(models.Address);
User.belongsToMany(models.UserGroup, {
through: "user_to_user_group"
});
}
},
});
return User;
};
router.post('/user/add', function(req, res, next) {
var data = req.body;
model.User.build(data.user)
.save()
.then(function(newUser){
async.map(data.user.user_group_ids, function(userGroupId, callback){
model.UserGroup.find({
where: {
id: userGroupId
}
})
.then(function(userGroup) {
// I'm getting here without any trouble
userGroup.addUser(newUser) // this line throws the error
.then(function(){
callback(null, userGroup);
});
});
}, function(error, userGroups){
if (!error) {
res.status(200).send('User created!');
} else {
res.status(500).send('Something bad happened!');
}
});
})
.catch(function(error){
console.log(error);
});
});
如果同时使用hasMany和BelongToMany,请将hasMany切换为BelongToMany。我不完全确定这是错误,但让我们从这里开始。另外,记住在一个内部返回承诺,这样错误就可以通过承诺链正确传播。