续集 - hasMany() - setter 将前一行的外键重置为 null



我的应用程序的功能之一是根据查询参数检查某人从何处访问链接。

基于此,我有以下代码在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)

最新更新