Проблемы с вызовом функции firebase

#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(` как показано в документации.