Firebase错误:加载用户代码(node.js)时函数失败

czfnxgou  于 2023-01-31  发布在  Node.js
关注(0)|答案(9)|浏览(169)

我是一个相对noob与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

在以下index.js文件中,还有3个相同的错误对应于其他导出。

    • 索引. 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"}

下面是我的package.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
}

最后,这里是我的配置的东西,用于初始化一切:

    • 管理员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 }
    • 火力基地初始化**
const firebase = require('firebase');
const config  = require('../util/config.js');
firebase.initializeApp(config);

值得一提的是,http.onRequest触发器(api)实际上是工作的,我一直在开发,没有部署使用firebase服务。现在,我准备部署这些触发器的东西是可怕的错误。任何帮助是非常感谢

dldeef67

dldeef671#

输入此命令以获取日志:

firebase functions:log
esbemjvw

esbemjvw2#

我遇到了完全相同的问题,试图部署与您完全相同的代码,我只是能够让它正确部署。
如果你的问题和我的问题一样,这就是问题所在:

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

看起来在部署到firebase时,您不能让代码尝试访问项目文件夹之外的内容,因此解决方案是在项目文件夹中包含不建议使用的密钥,或者将环境变量GOOGLE_APPLICATION_CREDENTIALS设置为您的服务帐户密钥json文件的文件路径,如www.example.com中所述https://firebase.google.com/docs/admin/setup#windows,然后仅使用

admin.initializeApp();
neskvpey

neskvpey3#

我在设置SendGrid时遇到了同样的问题。
我得到这个错误是因为我不小心将SendGrid安装到了根文件夹而不是函数文件夹。
确保使用cmd提示符将您的服务安装到functions文件夹中。它应该如下所示:

D:\firebaseProject\functions> npm i @sendgrid/mail
x33g5p2x

x33g5p2x4#

我有这个错误一次,我修复了它,通过再次检查我的代码,检查可能你需要或导入一个依赖项或模块,你还没有安装,并尝试检查您的package.json文件,以确保您安装了所有必要的模块和依赖项。
但是,问题主要是由于导入了一个您没有安装的模块,或者您的代码中存在bug

wko9yo5t

wko9yo5t5#

在我的情况下,我有一个文件开始与大写字母,但要求(...)与小写字母,它在Mac上工作,因为它忽略了它,正如我所理解的,但部署这些函数导致这个错误。
将文件重命名为小写为我修复了这个错误。

falq053o

falq053o6#

我的问题是因为我试图导入一个依赖于非独立标准的模块

const axioms = require("axioms");

我通过将模块名称version添加到package.json文件的依赖项列表中来解决这个问题。

"dependencies": {
    ....
    "axios": "^0.27.2"
}

我用这个命令得到了模块版本

npm view axios version
gdx19jrr

gdx19jrr7#

在推荐答案的建议下,我将所有云函数代码移到了index.js文件中(而不是“require”语句),这似乎对我很有效。注意,我省略了任何API键等,它仍然有效。我假设由于此部署是由firebase CLI处理的,它已经知道这是一个受信任的环境。

wztqucjr

wztqucjr8#

我也遇到了同样的问题。检查你的package.json文件是否有你用来编写firebase函数的所有依赖项。
例如,我编写了一个firebase函数,在其中调用了nodemailer dependancy,但没有安装在“functions”目录的package.json文件中
注意:请记住只在'functions'目录中安装所需的软件包

k0pti3hp

k0pti3hp9#

查看部署时日志的另一种方法是转到Google Cloud Console中的日志资源管理器。
如果您不熟悉Google Cloud控制台,可能是因为您只熟悉Firebase控制台(Google Cloud控制台的简化版本),请查看这些文档了解如何访问Google Cloud控制台上的日志资源管理器。
在我的例子中,我必须从日志资源管理器访问日志,因为当我按照Chinmay Atrawalkar的建议运行firebase functions:log时,我得到了错误Error: Failed to list log entries Failed to retrieve log entries from Google Cloud.
通过日志资源管理器,我可以看到以下错误:Detailed stack trace: Error: Cannot find module 'file-saver'。从那里我能够弄清楚我只需要通过从我的函数目录运行yarn add file-saver来将file-saver添加到我的函数/package. json依赖项中。

相关问题