在Node.js中获取空数组

时间:2018-07-06 06:51:21

标签: node.js mongodb asynchronous

我正在发布值,但是我正在获取空数组。我知道它的节点异步问题。但是我不知道该怎么解决。我已经引用了以下链接:

How do I return the response from an asynchronous call?

但是我听不懂。请帮助我理解诺言以及如何在代码中使用诺言。

router.post('/inspection_list', function (req, res) {
    var id = req.body.project_id;
    console.log(id)
// res.send("ok")
    db.inspection.findOne({'_id':id},(err,response)=>{
        if(err){
            console.log("error");
        }
        else{
            console.log("Data")
            var inspection = [];
            var data = response.inspection_data;
      var f =  data.map(function (item) { 
                var fielduser = item.fielduser_id
                db.fielduser.findOne({'_id': mongoose.Types.ObjectId(fielduser)},(err,user)=>{
                    console.log(user.owner_name);
                    console.log(item.inspection_name)
                    inspection.push({inspection_name:item.inspection_name,field_user_name : user.owner_name})


                })
                });
console.log(inspection) // Here am getting empty value
           // setTimeout(function(){ console.log(inspection) }, 5000); my timeout code


        }
    })
});

2 个答案:

答案 0 :(得分:2)

router.post('/inspection_list', async function (req, res) {
    var id = req.body.project_id;
    try{
        var response = await db.inspection.findOne({'_id':id})
        var inspection = [];
        var data = response.inspection_data;
        for ( var i = 0; i<data.length; i++){
            var item = data[i]
            var fielduser = item.fielduser_id
            var user = await db.fielduser.findOne({'_id': mongoose.Types.ObjectId(fielduser)})
            inspection.push({inspection_name:item.inspection_name,field_user_name : user.owner_name})
       }
    }
    catch(err){
        throw err
    }
})

这使用异步并等待,如果使用节点版本> = 7.6,则可以使用它

还请注意以下几点:

  

router.post('/ inspection_list',异步函数(req,res)


分别处理每个错误

router.post('/inspection_list', async function (req, res) {
    var id = req.body.project_id;
    try{
        var response = await db.inspection.findOne({'_id':id})
    }
    catch(err){
        // handle error here
        throw err
    }
    var inspection = [];
    var data = response.inspection_data;
    for ( var i = 0; i<data.length; var item = data[i]
        var fielduser = item.fielduser_id
        try{
            var user = await db.fielduser.findOne({'_id': mongoose.Types.ObjectId(fielduser)})
        }
        catch(err){
             // handle error
        }            
        inspection.push({inspection_name:item.inspection_name,field_user_name : user.owner_name})
   }

})

答案 1 :(得分:0)

使用猫鼬是一种简单的方法,它为所有查询和保存函数返回Promises,因此您只需执行以下操作:  YourModel.findOne({params}).then(() => {...})

如果您无法执行此操作,则应为“承诺”示例:

var findAndFillArray = (project_id) => new Promise((resolve) => {
    .... your previous code here .... 
    inspection.push({inspection_name:item.inspection_name,field_user_name : 
      user.owner_name})
    if (data.length === inspection.length){  // Or some other preferred condition
       resolve(inspection);
    }
})

然后,您将在获得ID后像其他任何函数一样调用此函数:

var id = req.body.project_id;
findAndFillArray(id).then((inspection_array) => {
    res.send(inspection_array) // Or whatever
})

现在,地图和所有列表函数在JS中都是同步的,您确定错误是由于此引起的吗?