Как получить файл JSON с внешнего URL (PLACES API) с помощью функций Firebase - PullRequest
0 голосов
/ 03 июля 2019

Итак, Я хочу отправить запрос из моего приложения в Firebase с помощью облачных функций, а затем обработать URL-адрес процесса и отправить обратно файл JSON из мест api

ЧТО Я УЖЕ СДЕЛАЛ / ИМЕЛ => После настройки проекта в консоли и получения firebase CLI создал облачную функцию следующим образом

После следования вашим комментариям это мой полный код функции:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const rp = require('request-promise');

exports.fetch = functions.https.onCall((req, res) => {

    const url = req.url + '&key=MY_API_KEY';
    var options = {
        uri: url, // Automatically parses the JSON string in the response
        json: true
    };  

    rp(options)
    .then(result => {
        console.log('Get response:' + response.statusCode);
        return res.type('application/json').send(result);
    }).catch(err => {
        // API call failed...
        return res.send({'Error': err});
    });

})

и в классе java передаются такие значения, как это

     private Task<String> addMessage(String url) {
            // Create the arguments to the callable function.
            Map<String, Object> data = new HashMap<>();
            data.put("url", url);///PASSING VALUES HERE
            return mFunctions
                    .getHttpsCallable("fetch")
                    .call(data)
                    .continueWith(task -> 
(String) Objects.requireNonNull(task.getResult()).getData());
        }

Теперь, в чем заключается моя проблема при развертывании нового кода функции с помощью Firebase CLI, я получаю 16:8 error Each then() should return a value or throw promise/always-return как ошибку

Может кто-нибудь направить меня, пожалуйста ..,

URL будет выглядеть так: https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=17.4369681,78.4473887&radius=5000&type=airport&sensor=true&key=MY_KEY

Вот подробности журнала с консоли

2019-07-05T10:06:35.025308453Z D fetch: Function execution started
2019-07-05T10:06:35.265840608Z D fetch: Function execution took 241 ms, finished with status code: 200
2019-07-05T10:06:45.162Z I fetch: Get response:undefined
2019-07-05T10:06:46.062Z E fetch: Unhandled rejection
2019-07-05T10:06:46.062Z E fetch: TypeError: res.send is not a function
    at rp.then.catch.err (/srv/index.js:22:14)
    at bound (domain.js:301:14)
    at runBound (domain.js:314:12)
    at tryCatcher (/srv/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/srv/node_modules/bluebird/js/release/promise.js:517:31)
    at Promise._settlePromise (/srv/node_modules/bluebird/js/release/promise.js:574:18)
    at Promise._settlePromise0 (/srv/node_modules/bluebird/js/release/promise.js:619:10)
    at Promise._settlePromises (/srv/node_modules/bluebird/js/release/promise.js:695:18)
    at _drainQueueStep (/srv/node_modules/bluebird/js/release/async.js:138:12)
    at _drainQueue (/srv/node_modules/bluebird/js/release/async.js:131:9)
    at Async._drainQueues (/srv/node_modules/bluebird/js/release/async.js:147:5)
    at Immediate.Async.drainQueues (/srv/node_modules/bluebird/js/release/async.js:17:14)
    at runCallback (timers.js:810:20)
    at tryOnImmediate (timers.js:768:5)
    at processImmediate [as _immediateCallback] (timers.js:745:5)

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Это сработало для меня. Использование возврата до обещания возвращает результат из обещания, и нам нужно использовать return при использовании functions.https.onCall и res.send при использовании functions.https.onRequest Мне потребовалось 3 дня, чтобы получить его инет необходимости добавлять json=true в параметрах запроса-обещания, когда ваш URL возвращает json, это только усложняет задачу

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const rp = require('request-promise');

exports.fetch = functions.https.onCall((req, res) => {

    const url = req.url + '&key=MY_API_KEY';
    var options = {
        uri: url, // Automatically parses the JSON string in the response
    };

    return rp(options)
    .then(result => {
        console.log('here is response: ' + result);
        return result;
    }).catch(err => {
        // API call failed...
        return err;
    });

})
1 голос
/ 03 июля 2019

Вы должны использовать обещания в своей облачной функции для обработки асинхронных задач (например, обращения к URL). По умолчанию запрос не возвращает обещания, поэтому вам необходимо использовать интерфейсную оболочку для запроса, например запрос-обещание .

Следующие адаптации должны помочь:

const rp = require('request-promise');

exports.fetch = functions.https.onCall((req, res) => {

  const url = req.url + '&key=MY_API_KEY';
  console.log(url);

  var options = {
    uri: url,
    json: true // Automatically parses the JSON string in the response
  };

  rp(options)
    .then(response => {
      console.log('Get response: ' + response.statusCode);
      res.send(response);
    })
    .catch(err => {
      // API call failed...
      res.status(500).send('Error': err);
    });

})
...