Использование функций Firebase с Nuxt 3

Окружающая среда

  • Операционная система: macOS 10.15.7
  • Версия узла: v16.14.2
  • Следующая версия: 3.0.0-rc.2
  • Firebase: 9.7.0
  • Firebase-админ: 10.2.0
  • firebase-функции: 3.21.0
  • firebase-функции-тест: 0.3.3

В firebase.json установлен следующий конфиг:

{
"functions": { "source": ".output/server" }
}

У меня есть файл в каталоге «сервер», содержащий следующую функцию:

import * as functions from "firebase-functions";

export const helloWorld = functions.https.onRequest((request, response) => {
    functions.logger.info("Hello logs!", {structuredData: true});
    response.send("Hello from Firebase!");
});

Когда я бегу:

NITRO_PRESET=firebase npm run build
firebase emulators:start --only functions

затем перейдите в мой журнал эмулятора firebase, он не показывает инициализацию новой функции helloWorld(). Кроме того, при переходе на «http://localhost:5001/$PROJECTNAME/us-central1/helloWorld» возвращается «Функция us-central1-helloWorld не существует, допустимые функции: us-central1-server», что предполагает, что моя функция не была инициализирована.

Есть ли способ написать облачные функции Firebase в моем приложении Nuxt 3 из файлов в каталоге моего сервера?

Я видел похожее обсуждение здесь, в котором говорилось, что можно изменить объект nuxt.config.ts functions между функциями развертывания, хранилищем, firestore и развертыванием сервера и хостинга. Я пытаюсь писать функции firebase исключительно в каталоге «сервер», не создавая каталог «функции» и корень моего проекта. Это возможно?

Я также открыл обсуждение на GitHub здесь.

Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
4
0
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

К сожалению, процедура, которой вы следуете, имеет некоторые моменты, на которые следует обратить внимание. Как упоминалось ранее в этом нить:

The Vue.js app is a front-end component (even if it is hosted in a cloud service like Firebase Hosting). The Cloud Functions are serverless back-end components, hosted in the Firebase (Google Cloud) infrastructure and reacting to events.

To get these two components interacting with each other there are basically two possibilities:

  • For Callable Cloud Functions and HTTPS Cloud Functions, you will call them from your Vue.js app.
  • For background triggered Cloud Functions (e.g. triggered by a Firestore event like doc creation), the Vue.js front-end could generate the event (e.g. write to Firestore) and/or listen to the result of a Cloud Function execution (e.g. a Firestore doc is modified).

As explained in the documentation, to call the Callable Function from your Vue.js app, you need to do as follows (with the JS SDK v9):

Add Firebase to your Vue.js app. For example via a firebaseConfig.js file:

   import { initializeApp } from "firebase/app";
   import { getFirestore } from "firebase/firestore";
   import { getFunctions } from "firebase/functions";
  
   const firebaseConfig = {
   apiKey: "...",
   // ....
   };
  
   const firebaseApp = initializeApp(firebaseConfig);
   const db = getFirestore(firebaseApp);
   const functions = getFunctions(firebaseApp);
  
   export { db, functions };

Then, in your component, you do

   <script>       
   import { functions } from '../firebaseConfig';
   import { httpsCallable } from 'firebase/functions';
  
   // ...
   methods: {
   async callFunction() {
   const addMessage = httpsCallable(functions, 'addMessage');
   const result = await addMessage({ text: messageText })
   const data = result.data;
   //...
   });
  
  }
  
   </script>

Я также попытался воспроизвести проблему и успешно развернул функции на эмуляторе с тем же подходом, что и в вопросе, следуя документации GCP о том, как добавить Firebase для вашего проекта, и используя этот Учебник по ютубу в качестве руководства, в нем есть несколько важных советов по как добавить Firebase в проект NuxtJS.

Я оставлю пример того, как мой файл firebase.json выглядел после того, как все настройки были завершены:

{
  "firestore": {
    "rules": "firestore.rules",
    "indexes": "firestore.indexes.json"
  },
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint"
    ],
    "source": ".output/server" 
  },
  "hosting": {
    "site": "<your_project_id>",
      "public": ".output/public",
      "cleanUrls": true,
      "rewrites": [{ "source": "**", "function": "server" }],
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}

Кроме того, я хотел бы предложить использовать Интерфейс командной строки Firebase, так как он имеет больше специальных возможностей, и проверить этот Средний гид, чтобы более подробно изучить, как добавить Firebase в Nuxt.

Он хочет использовать nuxt3 в качестве внешнего сервера. Он хочет использовать такие библиотеки, как SDK firebase-functions и SDK firebase-admin. Эти библиотеки работают в среде узла.

Mises 11.05.2022 00:12

Да, все правильно, и ответ тоже об этом говорит. Не могли бы вы уточнить? Мой ответ объясняет, как развернуть облачные функции с использованием Nuxt 3 в качестве внешнего интерфейса, и я также смог применить приложение через сервер Nitro.

Alex 11.05.2022 00:18

Там нечего уточнять. Пример, который вы написали, работает только как открытый API для всех, если мы говорим о видео. Он хочет иметь возможность аутентифицировать пользователей и выполнять действия в базе данных. Ему нужно использовать firebase-functions и firebase-admin SDK.

Mises 11.05.2022 00:48

Да, и это возможно. Ему просто нужно следовать моему ответу.

Alex 11.05.2022 00:49

Итак, покажите нам, как он может аутентифицировать внешние HTTP-вызовы.

Mises 11.05.2022 00:51

Я не думаю, что это главный вопрос пользователя, но если у вас есть что добавить, вы можете опубликовать это как комментарий или ответ.

Alex 11.05.2022 00:53

Другие вопросы по теме