我正在尝试实现一个投票系统,以便我的应用程序的用户可以对其他用户对问题的回答进行投票。
它是一个在后端使用 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
Controller 文件中,我可以尝试创建一个新的投票,给定一个 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
属性应存储什么值的 bool 值,但我还是收到了一个错误,指出 notNull Violation: Vote.upVote cannot be null
。我开始添加非空约束的唯一原因是因为没有它,我刚刚收到了
upVote
值为空的投票。有谁知道为什么会发生这种情况?
最佳答案
我不知道确切的原因,但将 response.addVote
替换为:
const vote = await Vote.create({
upVote: req.body.upVote,
UserId: req.user.id,
ResponseId: req.params.responseId
})
res.send(vote)
工作良好。奇怪的。我不断遇到问题,即 Sequelize 应该为关系提供的所谓“神奇”自动生成函数不可用或不起作用。
关于javascript - Sequelize n :m association - Voting system - cannot set attribute of join table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49920762/