我的应用程序的功能之一是根据查询参数检查某人从何处访问链接。
基于此,我有以下代码在Clicks
表中注册单击;然后我将外键设置为另一个表中的URL
;最后,我将外键设置为也在另一个表中的 Origin(Origins
(。
如果我使用属于 To 而不是 hasMany,但在点击和click.setUrl(url)
而不是url.setClick(click)
时,一切正常。
const urlCode = req.params.urlCode
const org = req.query.org
let err
try {
const url = await Urls.findOne({ where: { urlCode: urlCode } })
const origin = await Origins.findOne({ where: { abbr: org } })
if (url === null) {
res.redirect(`${process.env.WEB_URL}/not-found`)
err = { code: 404, msg: 'URL Not found' }
throw err
}
const click = await Clicks.create()
click.setOrigin(origin)
* url.setClick(click)
res.redirect(url.originalUrl)
} catch (err) {
console.log(err)
res.status(err.code).send(err.msg)
}
问题
这是输出。最后 2 行与上面带有星座的标记线相关。
问题是在第二行,setter 将以前的 id 重置为 NULL。
Executing (default): UPDATE `Clicks` SET `originId`=NULL,`updatedAt`='2019-06-10 11:05:16' WHERE `id` = 5
Executing (default): UPDATE `Clicks` SET `UrlId`=NULL,`updatedAt`='2019-06-10 11:05:16' WHERE `id` IN (4)
Executing (default): UPDATE `Clicks` SET `UrlId`=1,`updatedAt`='2019-06-10 11:05:16' WHERE `id` IN (5)
模型:
module.exports = (sequelize, DataTypes) => {
const Urls = sequelize.define('Urls', {
originalUrl: {
type: DataTypes.STRING,
allowNull: false
},
shortUrl: { type: DataTypes.STRING },
urlCode: { type: DataTypes.STRING }
})
Urls.associate = function (models) {
Urls.hasMany(models.Clicks, { as: 'click' })
}
return Urls
}
module.exports = (sequelize, DataTypes) => {
const Clicks = sequelize.define('Clicks')
Clicks.associate = function (models) {
Clicks.belongsTo(models.Origins, { as: 'origin' })
}
return Clicks
}
module.exports = (sequelize, DataTypes) => {
const Origins = sequelize.define('Origins', {
origin: {
type: DataTypes.STRING
},
abbr: {
type: DataTypes.STRING
}
})
return Origins
}
解决了问题。
const click = await Clicks.create()
click.setOrigin(origin)
//- url.setClick(click)
+ url.addClick(click)
res.redirect(url.originalUrl)