我正在尝试实施投票系统,以便我的应用用户可以对其他用户对问题的回复进行投票。
这是一个在后端使用Express和Sequelize的Node应用程序,目前我正在使用SQLite数据库以便于测试。
这是我模特的相关部分:
// in user.js
User.associate = function (models) {
// ...
models.User.belongsToMany(models.Response, {
through: models.Vote,
as: 'Votes'
})
}
// in response.js
Response.associate = function (models) {
// ...
models.Response.belongsToMany(models.User, {
through: models.Vote,
as: 'Votes'
})
}
// in vote.js
module.exports = (sequelize, DataTypes) => {
return sequelize.define('Vote', {
upVote: {
type: DataTypes.BOOLEAN,
allowNull: false
}
})
}
现在在我的votes.js
控制器文件中,我可以尝试创建一个新的投票,给定UserId
和ResponseId
如下:
const user = await User.findById(req.user.id)
const response = await Response.findById(req.params.responseId)
await response.addVote(user, {
upVote: true
})
res.send(await response.getVotes())
问题是,尽管Votes
连接表是正确创建的,虽然我传递addVote
函数一个布尔值直接指示upVote
属性应存储的值,但我只是收到错误,指出notNull Violation: Vote.upVote cannot be null
。
我开始添加非空约束的唯一原因是因为没有它,我刚收到upVote
的空值投票。
有谁知道为什么会这样?
答案 0 :(得分:0)
我不确切知道原因,但用此替换response.addVote
:
const vote = await Vote.create({
upVote: req.body.upVote,
UserId: req.user.id,
ResponseId: req.params.responseId
})
res.send(vote)
工作正常。奇。我一直在遇到所谓的“魔法”问题。 Sequelize应该为关系提供的自动生成的功能要么无法使用,要么无法正常工作。