Получение списка пустых объектов для вызовов API в Firebase - PullRequest
0 голосов
/ 17 марта 2020

Я создаю приложение Firebase, которое рассчитывает время коммутирования между адресами «от» и «до», которые хранятся в моей базе данных реального времени. Я хочу вызвать API для расчета каждой поездки и вернуть те времена коммутирования, как только все будут рассчитаны. Я впервые использую Promise.all, чтобы создать такое поведение. Однако, в конце концов, я получаю только пустые объекты для результата моих вызовов. Любые советы?


exports.updateCommutes = functions.https.onRequest((request, response) => {
  const ref = admin.database().ref('/users/test_user/commutes');

  return ref.once('value').then((snapshot)=>{

    var urls = [];

    const testURl = 'https://maps.googleapis.com/maps/api/distancematrix/json?key=XXXX&origins=Boston,MA&destinations=Cambridge,MA'; // I'm using a test API call for now


    return Promise.all([fetch(testURl),fetch(testURl)])
    .then((responses)=>{
      return responses.map((res)=>res.json())
    })
    .then((data)=>{
      console.log(data);// this prints out: [ Promise { <pending> }, Promise { <pending> } ]
      return response.send(data);
    })


  })
  .catch((error)=>console.log("error$"+error))
});

Моя база данных выглядит так:

icommute-firebase
-   users
-   -   test_user
-   -   -   commutes
-   -   -   -   M26JimVJ3P_nEvm1L6n
-   -   -   -   -   from: Boston,MA
-   -   -   -   -   to: Cambridge,MA
-   -   -   -   M26Joyu-rLGomY_oElm
-   -   -   -   M26JtYyvGK_fCx0FE-Q
-   -   -   -   M26Qhuc-gebRppy320c

С почтальоном по GET-запросу на http://localhost: 5001 / icommute-firebase / us-central1 / updateCommutes , приводит к:

[
    {},
    {}
]

, когда я ожидаю:

[
{
   "destination_addresses": [
      "Cambridge, MA, USA"
   ],
   "origin_addresses": [
      "Boston, MA, USA"
   ],
   "rows": [
      {
         "elements": [
            {
               "distance": {
                  "text": "4.9 km",
                  "value": 4925
               },
               "duration": {
                  "text": "16 mins",
                  "value": 978
               },
               "status": "OK"
            }
         ]
      }
   ],
   "status": "OK"
},
{
   "destination_addresses": [
      "Cambridge, MA, USA"
   ],
   "origin_addresses": [
      "Boston, MA, USA"
   ],
   "rows": [
      {
         "elements": [
            {
               "distance": {
                  "text": "4.9 km",
                  "value": 4925
               },
               "duration": {
                  "text": "16 mins",
                  "value": 978
               },
               "status": "OK"
            }
         ]
      }
   ],
   "status": "OK"
}
]

1 Ответ

1 голос
/ 18 марта 2020

res.json() также возвращает Обещание. Таким образом, вы должны справиться с этим тоже. См. Пример ниже:

const fetch = require('node-fetch');

const testURl = 'https://jsonplaceholder.typicode.com/todos/1'
return Promise.all([fetch(testURl),fetch(testURl)])
    .then((responses)=>{
      // res.json() returns a Promise.
      // We need to wrap them again in Promise.all()
      return Promise.all(responses.map((res)=>res.json()));
    })
    .then((data)=>{
      console.log(data);
    });

В нем записывается ожидаемый результат:

[ { userId: 1,
    id: 1,
    title: 'delectus aut autem',
    completed: false },
  { userId: 1,
    id: 1,
    title: 'delectus aut autem',
    completed: false } ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...