Получение пустого массива в nodejs - PullRequest
0 голосов
/ 06 июля 2018

Я отправляю значение, но я получаю пустой массив. Я знаю его узел асинхронной проблемы. Но я не знаю, как мне решить это. У меня есть ссылка на следующую ссылку:

Как вернуть ответ от асинхронного вызова?

Но я не мог понять. Пожалуйста, помогите мне понять обещания и как я могу использовать это в моем коде.

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 голосов
/ 06 июля 2018
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 ('/ inspe__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})
   }

})
0 голосов
/ 06 июля 2018

Использование mongoose было бы самым простым выходом: оно возвращает 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);
    }
})

Затем вы получите эту функцию после получения идентификатора, как и любая другая функция:

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

Теперь, карта и всефункции списка синхронны в JS, вы уверены, что ошибка связана с этим?

...