【问题标题】:Sequelize reload() wiping out all model dataSequelize reload() 清除所有模型数据
【发布时间】:2019-12-24 00:00:10
【问题描述】:

我正在尝试重新加载模型以包含关联。这是我的代码:

const order = new Order({ total: 0 })

return order.save().then(savedOrder => {

    const orderItems = req.body.items.map(i => {
        return Eliquid.findByPk(i.eliquid).then(eliquid => {

         const item = Item.build({
           qty: i.qty,
           n: i.n,
         })

         item.setEliquid(eliquid)
         item.setOrder(savedOrder)

         return item
             .save().then(i => {
                 console.log('Saved, has id, has qty', i.id, i.qty)
                 return i.reload()
              })
              .then(i => {
                  console.log('Reloaded, qty is now NULL!', i.id, i.qty)
                  return i
              })
         })
    })

为什么在重新加载我的实例后它会被淘汰?不知道自己做错了什么

【问题讨论】:

    标签: node.js promise sequelize.js associations


    【解决方案1】:

    据我所知,.reload()(与.save() 不同)不会将物品送回给客户;相反,它会将原始项目的属性与服务器上的属性同步。

    我不确定在这种情况下您是否真的需要重新加载,因为该项目的客户端和服务器表示将在 .save() 之后立即自动同步,但这里有一个示例,说明您将如何利用 javascript 的“关闭”来维护在.reload()之后访问该项目。

    const order = new Order({ 'total': 0 });
    return order.save()
    .then(savedOrder => {
        const orderItems = req.body.items.map(i => {
            return Eliquid.findByPk(i.eliquid)
            .then(eliquid => {
                const item = Item.build({ 'qty': i.qty, 'n': i.n });
                item.setEliquid(eliquid);
                item.setOrder(savedOrder);
                return item.save();
            })
            .then(ii => {
                console.log('Saved, has id, has qty', ii.id, ii.qty);
                return ii.reload()
                .then(() => { // .reload() does not repeat item back to client
                    console.log('same ii as before', ii.id, ii.qty); // here, access ii through closure.
                    return ii;
                });
            });
        });
    });
    

    注意事项:

    • 为了清楚起见,ii 在第二个 .then() 回调中使用,以避免重复使用 .map() 回调的符号 i
    • 内部的 promise 链尽可能地扁平化。如果您需要在第二个内部.then() 中访问eliquid,则需要恢复为return item.save().then() 并产生更高级别的嵌套。
    • 除了利用闭包之外,还有其他方法退出 - 请参阅 the comprehensive answers here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 2011-11-04
      相关资源
      最近更新 更多