#reactjs #firebase #google-cloud-functions
#reactjs #firebase #google-cloud-функции
Вопрос:
Я борюсь с вызовом функции firebase из веб-приложения-мобильного приложения, работающего на react / ionic.
Дело в том, что у меня есть приложение для автомобильного дневника, и для конкретного транспортного средства у меня есть вложенные коллекции с заправками / ремонтами и так далее. Когда пользователь хочет удалить транспортное средство, я хочу также удалить его вложенные коллекции, но, как мы все знаем, для этого нет встроенной функции. Насколько я понимаю, правильный способ добиться этого — создать функцию firebase. И здесь возникает проблема… это мое первое столкновение с ними, и теперь я участвую в гонках в течение 3 дней.
Это function/index.js:
import * as functions from 'firebase-functions';
export const cleanupAfterVehicle = functions.runWith({ timeoutSeconds: 540 }).https.onRequest(async
(request, response) => {
const firebase_tools = require('firebase-tools');
const userId = request.body.userId;
const vehicleId = request.body.vehicleId;
const collectionPath = `users/${userId}/vehicles/${vehicleId}/repairs`;
const token = 'MY TOKEN';
await firebase_tools.delete(collectionPath, {
project: 'project',
recursive: true,
yes: true,
token: token,
});
});
package.json
{
"name": "functions",
"scripts": {
"build": "tsc",
"serve": "npm run build amp;amp; firebase emulators:start --only functions",
"shell": "npm run build amp;amp; firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "10"
},
"main": "lib/index.js",
"dependencies": {
"firebase-admin": "^8.10.0",
"firebase-functions": "^3.6.1",
"firebase-tools": "^7.16.2"
},
"devDependencies": {
"typescript": "^3.8.0",
"firebase-functions-test": "^0.2.0"
},
"private": true
}
В службе приложений я пытаюсь вызвать его:
private async cleanupAfterVehicleRemove(vehicleId: string): Promise<void> {
let cleanupAfterVehicleFunction = functions.httpsCallable('cleanupAfterVehicle');
await cleanupAfterVehicleFunction({ userId: window.authContext.userId, vehicleId: vehicleId
}).then((result) => console.log(result));
}
Первая проблема из журналов firebase:
TypeError: firebase_tools.delete is not a function
at exports.cleanupAfterVehicle.functions.runWith.https.onRequest (/workspace/lib/index.js:13:32)
at cloudFunction (/workspace/node_modules/firebase-functions/lib/providers/https.js:51:16)
at process.nextTick (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/invoker.js:99:17)
at process._tickCallback (internal/process/next_tick.js:61:11)
Везде в примерах показано, что метод delete вызывается из firebase_tools, но нигде он не импортируется. Возможно, это одна из проблем, но я не могу ее исправить. Пробовал много раз, читал почти все, что похоже на мою проблему.
Вторая проблема заключается в том, что я не могу решить проблему CORS при вызове функции.
Access to fetch at 'https://us-central1-myProjectId.cloudfunctions.net/cleanupAfterVehicle' from
origin 'http://localhost:8100' has been blocked by CORS policy: Response to preflight request
doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the
requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to
fetch the resource with CORS disabled.
Функция успешно развернута в firebase в соответствии с интерфейсом командной строки firebase. Если вам нужна дополнительная информация о проблеме, скажите об этом.
Я был бы очень рад, если бы кто-нибудь помог мне разобраться в этих функциях.
С наилучшими пожеланиями!
Комментарии:
1. Пожалуйста, отредактируйте вопрос, чтобы сузить его до одной проблемы. Сообщения с несколькими проблемами могут быть закрыты как не относящиеся к теме. Я предлагаю рассмотреть CORS отдельно в другом посте.
Ответ №1:
Это определяет HTTP-функцию:
export const cleanupAfterVehicle = functions.runWith({ timeoutSeconds: 540 }).https.onRequest(async
Это не то же самое, что вызываемая функция.
HTTP-функции вызываются путем отправки им HTTP-запроса, в то время как вызываемые функции вызываются с помощью SDK клиентских функций. Хотя вызываемые функции построены поверх HTTP-функций под капотом, вы не можете вызывать обычные HTTP-функции с помощью вызываемой оболочки.
Таким образом, вам придется либо вызывать функцию через обычный HTTP ( GET~ from the looks of it) request, or convert your Cloud Functions code to implement
exports.addMessage = functions.https.OnCall(` как показано в документации.