Как объединить ответы от различных обещаний и вернуть их как один объект json клиенту - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь подсчитать количество документов в коллекции mongodb, основываясь на разных условиях.

Я могу получить данные и сформировать один объект json, но не могу отправить их в ответ клиенту.

В приведенном ниже коде вы видите, что это файл моего сервера(server.js), где я выполняю вызов API GET, в котором я пытаюсь выполнить несколько запросов к базе данных и возвращать значения в обещаниях.

Rfid - это модель mongoose, а sub - пустой объект json, который я инициализировал.В конце я пытаюсь объединить данные в один объект json, но я не могу отправить объект (под) json в ответ на вызов get api.

Возможно, это проблема области действия, ноЯ не могу это выяснить.

Пожалуйста, помогите мне.

server.js

app.get('/dashboard', function(req,res){
     var  sub = {};

     var sub1,sub2,sub3,sub4,sub5,sub6,sub7 = {};


    // no of cars entered
    Rfid.find( {entryTime :{$exists :true }})
    .then(function(res,err){
        if(err) console.log(err);
        var length = res.length;
         sub1 = {
             "no_of_cars_entered" : length
        }

         sub  = Object.assign(sub,sub1);

    });

    // no of cars waiting for inspection
    Rfid.find( {entryTime :{$exists :true },inwardInspecStartTime:{$exists:false}})
    .then(function(res,err){
        if(err) console.log(err);
        var length = res.length;
         sub2 = {
            "no_of_cars_waiting_for_inspection" : length
       }

        sub  = Object.assign(sub,sub2);


    });


    //no of cars inspected
    Rfid.find( {inwardInspecEndTime :{$exists :true }})
    .then(function(res,err){
        if(err) console.log(err);
        var length = res.length;
         sub3 = {
            "no_of_cars_inspected" : length
       }
       sub  = Object.assign(sub,sub3);
     });

    //no of cars waiting for invoice (inward REJECTION)
    Rfid.find( {inwardInspecEndTime :{$exists :true },invoiceTime:{$exists:false}})
    .then(function(res,err){
        if(err) console.log(err);
        var length = res.length;
         sub4 = {
            "no_of_cars_waiting_for_invoice" : length
       }
       sub  = Object.assign(sub,sub4);
    });

   // no of cars invoiced
    Rfid.find( {invoiceTime :{$exists :true }})
    .then(function(res,err){
        if(err) console.log(err);
        var length = res.length;
          sub5  = {
            "no_of_cars_invoiced" : length
       }
       sub  = Object.assign(sub,sub5);
    });

    //no of cars waiting for delivery ibnl
    Rfid.find( {invoiceTime :{$exists :true },deliveryInspecStartTime:{$exists :false}})
    .then(function(res,err){
        if(err) console.log(err);
        var length = res.length;
        sub6= {
            "no_of_cars_waiting_for_delivery" : length
       }
       sub  = Object.assign(sub,sub6);       
    });


    // no of cars delivered
    Rfid.find( {deliveryInspecEndTime :{$exists :true }})
    .then(function(res,err){
        if(err) console.log(err);
        var length = res.length;
          sub7 = {
            "no_of_cars_delivered" : length
       }
       sub  = Object.assign(sub,sub7);
       console.log(sub);


    })
    console.log(sub);


});

В результате я получаю ВЫВОД Я ПОЛУЧАЮ:

{ no_of_cars_entered: 6,
  no_of_cars_waiting_for_inspection: 1,
  no_of_cars_inspected: 5,
  no_of_cars_invoiced: 4,
  no_of_cars_waiting_for_invoice: 1,
  no_of_cars_waiting_for_delivery: 0,
  no_of_cars_delivered: 4 }
{}

где мне нужно получить

ОЖИДАЕМЫЙ ВЫХОД:

{ no_of_cars_entered: 6,
  no_of_cars_waiting_for_inspection: 1,
  no_of_cars_inspected: 5,
  no_of_cars_invoiced: 4,
  no_of_cars_waiting_for_invoice: 1,
  no_of_cars_waiting_for_delivery: 0,
  no_of_cars_delivered: 4 }

{ no_of_cars_entered: 6,
  no_of_cars_waiting_for_inspection: 1,
  no_of_cars_inspected: 5,
  no_of_cars_invoiced: 4,
  no_of_cars_waiting_for_invoice: 1,
  no_of_cars_waiting_for_delivery: 0,
  no_of_cars_delivered: 4 }

1 Ответ

0 голосов
/ 13 февраля 2019

Я предполагаю, что вы не ожидаете возврата ни одного из ваших обещаний, прежде чем пытаться отправить ответ (ваш фрагмент фактически не показывает, что вы отправляете ответ обратно), но при выполнении нескольких запросов вам нужно ждать ихвсе, чтобы закончить и вернуться обратно перед отправкой ответа.Вот пример использования ES6 native Promise lib.

app.get('/dashboard', function(req,res){
   let promiseArr = [
      Rfid.find( {entryTime :{$exists :true }}),
      Rfid.find( {entryTime :{$exists :true },inwardInspecStartTime:{$exists:false}}),
      Rfid.find( {inwardInspecEndTime :{$exists :true }}),
      Rfid.find( {inwardInspecEndTime :{$exists :true },invoiceTime:{$exists:false}}),
      Rfid.find( {invoiceTime :{$exists :true }}),
      Rfid.find( {invoiceTime :{$exists :true },deliveryInspecStartTime:{$exists :false}}),
      Rfid.find( {deliveryInspecEndTime :{$exists :true }})
   ]
   
   Promise.all(promiseArr)
    .then((resp) => {
      //build your obj here
      // resp[0] = the result of promiseArr[0] etc
      let obj = {};
      //populate obj
      res.send(obj);
      
    }).catch((err) => {
      res.status(500).send(err);
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...