问题
So, I want to send a request from my app to Firebase using cloud funtions and then process process url and send back JSON file from places api
WHAT I HAVE ALREADY DONE/HAVE=> After Setting up the project in console and getting firebase CLI created a cloud function as follows
After following your comments this is my full function code:
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});
});
})
and in java class passed values like this
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());
}
Now What my problem is while deploying new function code with firebase CLI I am getting 16:8 error Each then() should return a value or throw promise/always-return
as error
Can anyone guide me please..,
URL will be like this :
https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=17.4369681,78.4473887&radius=5000&type=airport&sensor=true&key=MY_KEY
Here are the log details from console
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)
回答1:
You should use promises, in your Cloud Function, to handle asynchronous tasks (like the call to the URL). By default request does not return promises, so you need to use an interface wrapper for request, like request-promise.
The following adaptations should do the trick:
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);
});
})
回答2:
This worked for me., using return before promise returns the result from promise, and we need to use return
when using functions.https.onCall
and res.send
when using functions.https.onRequest
it took me 3 days to get it & no need of adding json=true
in request-promise options when your url returns a json, it just made things complicated
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;
});
})
来源:https://stackoverflow.com/questions/56867732/how-to-grab-json-file-from-external-urlplaces-api-using-firebase-functions