如何使用 firebase 函数从外部 url(PLACES API) 抓取 json 文件

How to grab json file from external url(PLACES API) using firebase functions

所以, 我想使用云功能从我的应用程序向 Firebase 发送请求,然后处理进程 url 并从 api

位置发回 JSON 文件

我已经有了DONE/HAVE=> 在控制台中设置项目并获取 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 class 中传递了这样的值

     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)

您应该在 Cloud Function 中使用 promises 来处理异步任务(例如对 URL 的调用)。默认情况下 request 不会 return promises,所以你需要为请求使用接口包装器,比如 request-promise.

以下改编应该可以解决问题:

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);
    });

})

这对我有用。在 promise 之前使用 return return 是 promise 的结果,我们需要在使用 functions.https.onCall 和 [= 时使用 return 13=] 当使用 functions.https.onRequest 时,我花了 3 天时间才得到它,当你的 url return 是 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;
    });

})