使用Node.js进行异步调用后如何执行响应

时间:2019-01-23 05:19:04

标签: node.js mongodb

我需要使用Node.js和MongoDB执行一次异步调用后发送响应。我在下面解释我的代码。

 module.exports.getDashboardDetail = async(req, res, next) =>{
    console.log('Inside dashboard controller');


    var customerVisited=await Allocation.collection.aggregate([ 
    {$match:{}},
    {$unwind:"$zone_list"},
    {$unwind:"$zone_list.state_list"},
    {$unwind:"$zone_list.state_list.location_list"},
    {$unwind:"$zone_list.state_list.location_list.task_list"},
    {$unwind:"$zone_list.state_list.location_list.task_list.loan_accounts_assigned"},
    {$unwind:"$zone_list.state_list.location_list.task_list.loan_accounts_assigned.feedback_detail"},
    {$group:{
    _id:"total_feedback",
    count:{$sum:1}
    }
    }
    ])
    .toArray((err,docs)=>{
        if (!err) {
            customerVisited=docs
            console.log('custm',customerVisited);
        }else{
            console.log('err',err);
        }
    })
    var fosdata=await User.collection.countDocuments({},function(err,docs){
        if (!err) {
            fosdata=docs;
            //res.send(data);
            //console.log('nos of users',docs);
        }
    })
    var data = {"no_of_visited_customer": customerVisited,"no_of_fos": fosdata,"no_of_alerts": 15,"status":'success'};
    res.status(200).send(data);
    //return res.status(200).json({ status: true, data : _.pick(data )});
}

在这里,我需要在执行聚合方法后发送响应。在这里,在获得数据库结果之前,响应正在发送。

2 个答案:

答案 0 :(得分:0)

您可以写这样的东西,

var customerVisited=await Allocation.collection.aggregate([ 
    {$match:{}},
    {$unwind:"$zone_list"},
    {$unwind:"$zone_list.state_list"},
    {$unwind:"$zone_list.state_list.location_list"},
    {$unwind:"$zone_list.state_list.location_list.task_list"},
    {$unwind:"$zone_list.state_list.location_list.task_list.loan_accounts_assigned"},
    {$unwind:"$zone_list.state_list.location_list.task_list.loan_accounts_assigned.feedback_detail"},
    {$group:{
    _id:"total_feedback",
    count:{$sum:1}
    }
    }
    ])
    .toArray((err,docs)=>{
        if (!err) {
            customerVisited=docs
            console.log('custm',customerVisited);
        }else{
            console.log('err',err);
        }
    })
var data = {"no_of_visited_customer": customerVisited};
res.status(200).send(data); 

但是请确保编写此代码的函数是异步的(例如,在单词function之前添加单词async),例如,如果您的函数是

function test() {
// some code
}

应该是

async function test() {
// some code
}

答案 1 :(得分:0)

为什么要使用toArray(err,docs)?

// use your paths to models
const Allocation = require('../models/Allocation')
const User = require('../models/User')

module.exports.getDashboardDetail = async (req, res, next) => {
  try {
    console.log('Inside dashboard controller');
    var customerVisited = await Allocation.collection.aggregate([ 
      {$match:{}},
      {$unwind:"$zone_list"},
      {$unwind:"$zone_list.state_list"},
      {$unwind:"$zone_list.state_list.location_list"},
      {$unwind:"$zone_list.state_list.location_list.task_list"},
      {$unwind:"$zone_list.state_list.location_list.task_list.loan_accounts_assigned"},
      {$unwind:"$zone_list.state_list.location_list.task_list.loan_accounts_assigned.feedback_detail"},
      {$group: {
        _id:"total_feedback",
        count:{$sum:1}
        }
      }
      ])
      .toArray()
      var fosdata = await User.collection.countDocuments({})
      var data = {
        "no_of_visited_customer": customerVisited,
        "no_of_fos": fosdata,
        "no_of_alerts": 15,
        "status":'success'}
      res.status(200).send(data);
  } catch (e) {
    // if it is just a controller we can set status and send response
    // res.status(400).send(`Error ${e}`)
    
    // if using express middleware pass error to express with next(e)
    next(e)
  }
}