How do I pass this onRequest
function to onCall
? I am working from my localhost with emulators. Could someone give me some guidance, I have tried to follow the documentation of functions.https.onCall but I can't understand if I have to do any previous step.
export const getFileInformation = functions.https.onRequest( (req, res) => {
return cors( req, res, () => {
const urls = [
`url1`,
`url2`,
`url3`
];
const urlsCalls: any[] = [];
const resultados: any[] = [];
urls.forEach( url => {
urlsCalls.push(axios.get(url));
});
Promise.allSettled(urlsCalls)
.then( response => {
response.map( (element: any) => {
const item = element.value.data;
resultados.push(item);
});
console.log(resultados);
res.json(resultados);
})
.catch( error => {
console.log(error);
});
} );
});
I'm trying something as simple as this:
export const getFileInformation2 = functions.https.onCall( (data, context) => {
return { msg: 'Hello from Firebase!' };
});
But I get the following error:
{"error":{"message":"Bad Request","status":"INVALID_ARGUMENT"}}
How should I address an onCall
function?
HTTPS Callable functions must be called using the POST method, the Content-Type must be application/json
, and the body must contain a field called data
for the data to be passed to the method.
See sample body:
{
"data": {
"someKey": "someValue"
}
}
When pasting the URL directly to a browser it is called using the GET
method which returns an error Request has invalid method. GET
Request has invalid method. GET
and the reason you're getting {"error":{"message":"Bad Request","status":"INVALID_ARGUMENT"}}
is you're not passing the required field which is data
on your request body.
You can call a https.onCall
using curl or Postman. Sample call using curl:
curl -d '{"data": {"someKey": "someValue"}}' -H 'Content-Type: application/json' http://localhost:5001/[myProjectName]/us-central1/getFileInformation2
For more information, you may check:
Lo resolví asi:
index.ts
export const getFileInformation2 = functions.https.onCall( (data, context) => {
const urls = [
`url1`,
`url2`,
`url3`
];
const urlsCalls: any[] = [];
const resultados: any[] = [];
urls.forEach( url => {
return urlsCalls.push(axios.get(url));
});
return Promise.allSettled(urlsCalls)
.then( response => {
response.map( (element: any) => {
const item = element.value.data;
resultados.push(item);
});
console.log(resultados);
return resultados
})
.catch( error => {
console.log(error);
});
});
Luego ejecuto emulators:
firebase emulators:start --only functions
Luego lo llamo desde mi frontEnd:
component.ts
getFilesInformation() {
const functions = getFunctions(getApp());
connectFunctionsEmulator(functions, 'localhost', 5001);
const getInfo = httpsCallable(functions, 'getFileInformation2')
getInfo().then( (result: any) => {
console.log(result.data);
})
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.