Node.js 在express中发布多对多请求

Node.js 在express中发布多对多请求,node.js,rest,express,post,sequelize.js,Node.js,Rest,Express,Post,Sequelize.js,我有两个表:user和material,它们具有m:m关系。相交实体是日记材料。我正试图发送一个POST请求,以便在日记材料中插入内容。此外,此表有2个属性:recycledQuantity和recycleDate。我尝试了一些东西,但如果我插入了一个不存在的物质,它不会给我找不到 app.post('/users/:uid/materials/:mid', (req, res, next) => { User.findById(req.params.uid) .then((

我有两个表:user和material,它们具有m:m关系。相交实体是日记材料。我正试图发送一个POST请求,以便在日记材料中插入内容。此外,此表有2个属性:recycledQuantity和recycleDate。我尝试了一些东西,但如果我插入了一个不存在的物质,它不会给我找不到

 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))
})

稍微重写一下,让它更具可读性。已删除嵌套的承诺调用。。。当他们试图摆脱地狱的时候,我们不要陷入地狱

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));
});

您对ifuser的检查当前通过。看起来,如果是这样的话,你总是能找回一个物体。许多数据库通常不会简单地返回null或false值,而是返回一个包含大量元数据的对象。在该对象中,通常是您请求的数据,即user.data.id,但可能是user.data为NULL。你能确认用户的确切内容是什么吗?它的评估是真实的,因此它一定有什么东西在里面。

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

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));
    })

如果我插入一个不存在的materialId,它不会给我“未找到”-是的,这正是你这里的代码将要做的。问题是,如果它在db中查找id为2的eg材料,但没有找到,它应该进入else分支,给出未找到并退出,但我不明白他为什么不这样做…我误读了,我以为你说你找不到-那会发生什么?更清楚地说,我插入了一个userId=1的用户和一个materialId=1的材料,所以我没有更多的用户或材料,所以如果我发送userId=1和materialId=2的POST方法,我应该找不到,因为我没有materialId=2的材料,但是我被创建了,服务器给出了错误:未处理的拒绝错误:发送邮件后无法设置邮件头。感谢您重新编写!这更贴切,但不幸的是,它给了我一个错误:TypeError:无法在Promise.all设置undefined的属性“userId”。那是因为您的journalMaterial在您的请求正文中不存在谢谢!我在第一个if之后声明了let journalMaterial=req.body。现在,如果我给出的ID不存在,它会给出“找不到”,这很好,但它也会在服务器中给我一个错误:错误:发送头后无法设置头。您是否尝试过调试代码以查看实际情况?试着先这样做:它肯定会告诉你发生了什么。