Ошибка Firebase: сбой функции при загрузке кода пользователя (node.js) - PullRequest
1 голос
/ 11 июля 2020

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

Ошибка

!  functions[createNotificationOnlike(us-central1)]: Deployment error.
Function failed on loading user code. Error message: Error: please examine your function logs to see the error cause: https://cloud.google.com/functions/docs/monitoring/logging#viewing_logs

Есть еще 3 идентичных ошибки, которые соответствуют другим экспортам в следующем индексе. js файл.

Индекс. js

exports.createNotificationOnlike = functions.firestore.document('likes/{id}').onCreate(async (snapshot) => {
    try {
        const doc = await db.doc(`posts/${snapshot.data().postId}`).get(); // we have access to user handle via the likes route
        if(doc.exists){
            await db.doc(`notifications/${snapshot.id}`).set({ // the id of the like is the same as the id of the notification that pertains to the like
                createdAt: new Date().toISOString,
                recipient: doc.data.userHandle,
                sender: snapshot.data().userHandle,
                type: 'like',
                read: false,
                postId: doc.id
            });
            return;
        }    
    } catch (err) {
        console.error(err);
        return;
    }
});

exports.removeNotificationOnUnlikePost = functions.firestore.document('likes/{id}').onDelete( async (snapshot) => {
    try {
        await db.doc(`notifications/${snapshot.id}`).delete();
        return;   
    } catch (err) {
        console.error(err);
        return;
    }
})

exports.createNotificationForComments = functions.firestore.document('comments/{id}').onCreate(async (snapshot) => {
    try {
        const doc = await db.doc(`posts/${snapshot.data().postId}`).get();
        if(doc.exists){
            db.doc(`notifications/${snapshot.id}`).set({
                createdAt: new Date().toISOString,
                recipient: doc.data.userHandle,
                sender: snapshot.data().userHandle,
                type: 'comment',
                read: false,
                postId: doc.id
            })
            return;
        }
    } catch (err) {
        console.error(err);
        return; // we dont need return messages since this isnt an endpoint it is a db trigger event
    }
})

// auto turn the app into base route url/api
exports.api = functions.https.onRequest(app);

Я проверил журналы в соответствии с ошибкой и получаю следующие сообщения, которые я считаю бесполезными: есть еще три идентичные ошибки для других функций

Журналы ошибок

removeNotificationOnUnlikePost
{"@type":"type.googleapis.com/google.cloud.audit.AuditLog","status":{"code":3,"message":"Function failed on loading user code. Error message: Error: please examine your function logs to see the error cause: https://cloud.google.com/functions/docs/monitoring/logging#viewing_logs"}

Вот мой пакет. json файл

Пакет. json

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "serve": "firebase emulators:start --only functions",
    "shell": "firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "10"
  },
  "dependencies": {
    "busboy": "^0.3.1",
    "express": "^4.17.1",
    "firebase": "^7.16.0",
    "firebase-admin": "^8.10.0",
    "firebase-functions": "^3.6.1"
  },
  "devDependencies": {
    "firebase-functions-test": "^0.2.0"
  },
  "private": true
}

Наконец, вот моя конфигурация, которая использовалась для инициализации всего:

admin. js

const admin = require('firebase-admin');
var serviceAccount = require('../../service-acct/socialapp-e5130-firebase-adminsdk-uo6p6-5495e18b97.json');

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    storageBucket: "socialapp-e5130.appspot.com",
    databaseURL: "https://socialapp-e5130.firebaseio.com"
});

const db = admin.firestore();

module.exports = { db, admin }

Firebase init

const firebase = require('firebase');
const config  = require('../util/config.js');
firebase.initializeApp(config);

PS Стоит отметить, что триггер http.onRequest (api) действительно работал, и я разрабатываю без развертывания, используя firebase serve. Теперь, когда я готов задействовать эти триггеры, что-то идет ужасно неправильно. Любая помощь приветствуется

1 Ответ

1 голос
/ 12 июля 2020

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

Если у вас такая же проблема, как у меня, то здесь проблема:

var serviceAccount = require('../../service-acct/socialapp-e5130-firebase-adminsdk-uo6p6-5495e18b97.json');

Похоже, что при развертывании на firebase у вас не может быть кода, пытающегося выйти за пределы папки вашего проекта, поэтому решением будет иметь ключ внутри, который не рекомендуется, или установить переменную среды GOOGLE_APPLICATION_CREDENTIALS в путь к файлу вашего служебного аккаунта, ключ json файл, как описано в https://firebase.google.com/docs/admin/setup#windows, а затем просто

admin.initializeApp();
...