【问题标题】:POST request for many to many in express多对多快递的 POST 请求
【发布时间】:2018-09-07 09:16:54
【问题描述】:

我有 2 个表:用户和材料具有 m:m 关系。交集实体是 journalMaterials。我正在尝试发送一个 POST 请求以插入 journalMaterials。此外,该表有 2 个属性:recycledQuantity 和 recycleDate。我尝试了一些东西,但如果我使用不存在的 materialId 插入它不会给我“未找到”。

 app.post('/users/:uid/materials/:mid', (req, res, next) => {
  User.findById(req.params.uid)
    .then((user) => {
      if (user){
        let journalMaterial = req.body
        journalMaterial.userId = user.id
        Material.findById(req.params.mid)
         .then((material) => {
           if (material){
            journalMaterial.materialId = material.id
            return JournalMaterial.create(journalMaterial)
           }
           else{
        res.status(404).send('not found')
      }
         })}
      else{
        res.status(404).send('not found')
      }
    })
    .then(() => {
      if (!res.headers){
        res.status(201).json('created')
      }
    })
    .catch((err) => next(err))
})

【问题讨论】:

  • "如果我插入一个不存在的 materialId,它不会给我'未找到'" - 是的,这正是你在这里的代码将做的.
  • 问题是,如果它在数据库中查找 id 为 2 的材料,例如,它没有找到,它应该进入 else 分支,给出未找到并退出,但我没有不明白他为什么不那样做……
  • 我看错了,我以为你说你正在收到not found - 那么会发生什么
  • 为了更清楚,我插入了一个 userId=1 的用户和一个 materialId=1 的材料,所以我没有更多的用户或材料,所以如果我用 userId 发送我的 POST 方法=1 和 materialId=2 我应该得到“未找到”,因为我没有 materialId=2 的材料,而是我得到“创建”并且服务器给出错误:“未处理的拒绝错误:无法设置发送后的标头。”

标签: node.js rest express post sequelize.js


【解决方案1】:

我已经解决了。这是正确的代码。

app.post('/users/:uid/materials/:mid', (req, res, next) => {
      const { uid, mid } = req.params;
      Promise.all([
        User.findById(uid),
        Material.findById(mid)
      ])
        .then(([user, material]) => {
          if (user && material) {
            let journalMaterial  = req.body
            journalMaterial.userId = user.id
            journalMaterial.materialId = material.id
            res.status(201).json('created')
            return JournalMaterial.create(journalMaterial)
          }
          res.status(404).send('not found')
        })
        .catch(err => next(err));
    })

【讨论】:

    【解决方案2】:

    稍微重写一下,使其更具可读性。删除了嵌套的 promise 调用...(当他们试图摆脱回调地狱时,我们不要陷入 promise 地狱......)

    app.post('/users/:uid/materials/:mid', (req, res, next) => {
      const { journalMaterial } = req.body;
      const { uid, mid } = req.params;
      Promise.all([
        User.findById(uid),
        Material.findById(mid)
      ])
        .then(([user, material]) => {
          if (user && material) {
            journalMaterial.userId = user.id;
            journalMaterial.materialId = material.id;
            return JournalMaterial.create(journalMaterial);
          }
          res.status(404).send('not found');
        })
        .then(() => {
          if (!res.headers) {
            res.status(201).json('created');
          }
        })
        .catch(err => next(err));
    });
    

    您对if(user) 的检查目前已通过。似乎如果这就是发生的事情,你总是会得到一个对象。许多数据库通常不会简单地返回一个nullfalse 值,而是一个包含一堆元数据的对象。在该对象中通常是您请求的数据(即 user.data.id,但可能是 user.data 为 NULL)。你能验证Users 的确切内容是什么吗?它的评估是真实的,因此它必须有一些东西。

    【讨论】:

    • 感谢您重写!它更好,但不幸的是它给了我错误:“TypeError:无法在 Promise.all.then 设置未定义的属性 'userId'”
    • 那是因为您的请求正文中不存在您的“journalMaterial”
    • 谢谢!我在第一个 if 之后声明了 let journalMaterial=req.body。现在,如果我提供不存在的 id,它会给我“未找到”,这很好,但它也会在服务器中给我一个错误:错误:发送后无法设置标头。
    • 您是否尝试过调试代码以查看实际情况?先尝试这样做 :) 它肯定会告诉你发生了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多