Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.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 如何处理nodejs中的内部查询?_Javascript_Node.js - Fatal编程技术网

Javascript 如何处理nodejs中的内部查询?

Javascript 如何处理nodejs中的内部查询?,javascript,node.js,Javascript,Node.js,在nodeJS中创建了Rest Post类型API,其中: 我在这里执行两个查询。 1.首先对answers表执行查询,以获取该表中的用户Id和答案详细信息。//我在我的控制台上签了名,他们向我显示了两个用户Id 2.其次,根据我在find函数中传递的用户Id,对users表执行查询以获取用户详细信息。//检查我的控制台,它们向我显示两个应答对象,因为我有两个用户Id。 ------------------以上工艺效果良好--------------------- 现在,我被卡住了,因为,我有两

在nodeJS中创建了Rest Post类型API,其中: 我在这里执行两个查询。 1.首先对answers表执行查询,以获取该表中的用户Id和答案详细信息。//我在我的控制台上签了名,他们向我显示了两个用户Id 2.其次,根据我在find函数中传递的用户Id,对users表执行查询以获取用户详细信息。//检查我的控制台,它们向我显示两个应答对象,因为我有两个用户Id。 ------------------以上工艺效果良好--------------------- 现在,我被卡住了,因为,我有两个合并结果到一个对象中。 我正在做这件事,但不是完美的。帮帮我吧

我的代码:-

app.post('/getTopAns', function(req, res) {
 console.log("inside getTopAns ");
 var questionId=req.body.questionId;
 mongoose.model('answers').find({
   questionId:questionId,
   compliance:"Y"
 }, function(err, ansResult){
   for (var i = 0;i<ansResult.length;i++) {
   mongoose.model('users').findOne({
       userId:ansResult[i].userId,
   }, function(err,usrResult){
       var obj = {
           followerLength : usrResult.follower.length,
           upvote : ansResult[i].upvote
       }
    })
    console.log(obj);  
   }
});
})
app.post('/getTopAns',函数(req,res){
log(“内部getTopAns”);
var questionId=req.body.questionId;
mongoose.model('answers')。查找({
问号:问号,
合规性:“Y”
},函数(err,ansResult){

对于(var i=0;i也许您应该首先记录ansResult以查看db是否返回此值。如果返回,则检查usrResult。如果两者都返回,我通常使用lodash的assign或merge将两个对象合并为一个对象

我建议使用Promissions而不是callback来处理node.js的异步。流程是获取第一个调用结果,映射将结果数组放入承诺列表中,我们可以使用
Promise.all
等待结果。最后映射第一个列表中的第二个结果

app.post("/getTopAns", function(req, res) {
  console.log("inside getTopAns ");
  var questionId = req.body.questionId;
  mongoose.model("answers")
  .find({
    questionId: questionId,
    compliance: "Y"
  })
  .then(ansResult => {
    const promises = ansResult.map(ans => {
      return mongoose.model("users")
        .findOne({ userId: ansResult[i].userId })
    })

    return Promise.all(promises)
      .then(usrResults => {
        return usrResults.map((usrResult, i) => {
          followerLength: usrResult.follower.length,
          upvote: ansResult[i].upvote
        })
      })
  })
  .then(results => {
    console.log('got all results here', results)
  }) 
});
使用
async/await
会更好

app.post("/getTopAns", async (req, res) => {
  console.log("inside getTopAns ");
  var questionId = req.body.questionId;
  const ansResult = mongoose.model("answers")
    .find({
      questionId: questionId,
      compliance: "Y"
    })

  const promises = ansResult.map(ans => {
    return mongoose.model("users")
      .findOne({ userId: ansResult[i].userId })
  })

  const usrResults = await Promise.all(promises)

  const results =  usrResults.map((usrResult, i) => {
    followerLength: usrResult.follower.length,
    upvote: ansResult[i].upvote
  })

  console.log('got all results here', results)
});

更多信息可以在这里找到:

预期的输出是什么?它看起来怎么样?