Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法将两个api调用链接到mongo数据库_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript 无法将两个api调用链接到mongo数据库

Javascript 无法将两个api调用链接到mongo数据库,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我需要更改Mongo文档: 1.数组中所有对象的一个属性 2.数组中一个对象的一个属性 我看了mongoose文档,它说exec完全承诺了您的查询。嗯,我不太明白,然后我试着用链子拴住他们,但我不确定我是否做得好 route.js router.patch("/internado/:id", (req, res, next) => { const id = req.params.id; const updateOps = {}; for (let prop in req.bod

我需要更改Mongo文档: 1.数组中所有对象的一个属性 2.数组中一个对象的一个属性

我看了mongoose文档,它说exec完全承诺了您的查询。嗯,我不太明白,然后我试着用链子拴住他们,但我不确定我是否做得好

route.js

router.patch("/internado/:id", (req, res, next) => {
  const id = req.params.id;
  const updateOps = {};
  for (let prop in req.body) {
    updateOps[prop] = req.body[prop];
  }

  User.update(
    { _id: id },
    // this changes every element from object inside array
    // already tested the command in postman
    { $set: { "datosAcademicos.internados.$[].activo": false } }
  )
  .exec()
  .then(result => {
      console.log(result);
      res.status(200).json(result);
    })
    .catch(err => {
      console.log(err);
      res.status(500).json({ error: err });
    });

  User.update(
    { _id: id },
    // pushs the new element to array. Also tested by itself on postman
    { $push: { "datosAcademicos.internados": updateOps } }
  )
    .exec()
    .then(result => {
      console.log(result);
      res.status(200).json(result);
    })
    .catch(err => {
      console.log(err);
      res.status(500).json({ error: err });
    });
});

关于

首先,两次更新都将在某个时间结束

更快的用户将返回并应答res。发送并关闭连接。 当第二次更新完成时,res.send已关闭并将引发异常

你不能保证哪一个会先完成,如果顺序对你来说很重要,那么你应该真正地连锁,而不是一个接一个地写

如果这对你来说无关紧要,或者你只关心其中一个结果, 在代码中反映它

因此,如果你想连锁,那么一个接一个:

// lets execute the first update
User.update(
  { _id: id },
  { $set: { "datosAcademicos.internados.$[].activo": false } }
).exec()
// now we wait for it to finish
.then(res => {
   // do something with the first update ?
   // possibly res.send if you did like

   // now execute the other Update
   return User.update(
      { _id: id },
      { $push: { "datosAcademicos.internados": updateOps } }
   ).exec()
})
.then(res2 => {
   // possible res.send / other logging
   res.send('done all updates');
})
.catch(err => {
   console.log(err);
   res.status(500).json({ error: err });
});
如果要在不等待第一个的情况下同时执行它们:

Promise.all([
   User.update(
     { _id: id },
     { $set: { "datosAcademicos.internados.$[].activo": false } }
   ).exec(),
   User.update(
      { _id: id },
      { $push: { "datosAcademicos.internados": updateOps } }
   ).exec()
])
// wait for both of them to finish , order not guaranteed 
.then(result => {
   // result[0] - result for first update
   // result[1] - result for second update ..
   res.send(result);
})
.catch(err => {
   console.log(err);
   res.status(500).json({ error: err });
});
如果您只关心一个结果,但仍然希望执行两个更新,只需在代码中反映它,这样您就不会调用res.send两次


祝你好运

谢谢!这解决了我的问题。我仍然得到节点:19284未处理PromiserEjectionWarning:错误[ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置头错误。但我注释掉了第一个res.json,问题就解决了。你知道我做的事有什么缺点吗?这不是缺点的问题。问题是您可能会调用res.send/res.status两次。。。一次接一次,一次接一次。