【问题标题】:Firebase functions crashes while accessing firestoreFirebase 函数在访问 Firestore 时崩溃
【发布时间】:2022-01-10 12:44:42
【问题描述】:

您能在下面的代码中找到错误吗?

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();



exports.GetShort = functions.https.onRequest((request, response) => {
    response.header("Access-Control-Allow-Origin", "*");
    longURL = request.query.long
    functions.logger.info("url is - " ,longURL)
    SaveToDB(longURL)
})


function SaveToDB(link){
    functions.logger.info("here")
    admin.firestore().collection("url").where("urlNames","array_contains",link).get().then(
  
        function(querySnapshot){
            functions.logger.info("snap, " ,querySnapshot)
            querySnapshot.forEach(function(doc) {
            functions.logger.info("things :  " ,doc.id, " => ", doc.data())

                // doc.data() is never undefined for query doc snapshots
                console.log(doc.id, " => ", doc.data());
            });
        }
    ) .catch(function(error) {
        functions.logger.info("Error getting documents: ", error);
    });
}

点击上述函数后,firebase-functions 日志会显示日志直到“这里”。之后它崩溃,没有更多的日志/堆栈跟踪。

下面是functions目录下packages.json的内容。

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "lint": "eslint .",
    "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": "14"
  },
  "main": "index.js",
  "dependencies": {
    "firebase-admin": "^9.8.0",
    "firebase-functions": "^3.14.1"
  },
  "devDependencies": {
    "eslint": "^7.6.0",
    "eslint-config-google": "^0.14.0",
    "firebase-functions-test": "^0.2.0"
  },
  "private": true
}

【问题讨论】:

    标签: javascript firebase google-cloud-firestore google-cloud-functions


    【解决方案1】:

    我建议您观看Firebase video series 中关于“JavaScript Promises”的 3 个视频,了解如何管理 Cloud Function 的生命周期以及处理对异步方法的调用。

    特别是对于HTTPS Cloud Function,您需要以send()redirect()end() 结束它。

    所以你的代码可以修改如下:

    exports.GetShort = functions.https.onRequest((request, response) => {
        response.header("Access-Control-Allow-Origin", "*");
        const longURL = request.query.long;
        functions.logger.info("url is - ", longURL)
        SaveToDB(longURL)
        .then(() => {
            response.status(200).send('Saved to DB');
        })
        .catch(error => {
            // See video series
            response.status(500).send(error);
        })
    })
    
    
    function SaveToDB(link) {
        functions.logger.info("here")
        return admin.firestore().collection("url").where("urlNames", "array_contains", link).get()
        .then(querySnapshot => {
            functions.logger.info("snap, ", querySnapshot)
            querySnapshot.forEach(function (doc) {
                functions.logger.info("things :  ", doc.id, " => ", doc.data())
    
                // doc.data() is never undefined for query doc snapshots
                console.log(doc.id, " => ", doc.data());
                
                // => Here, depending on your real functional requirements, you may need to use Promise.all()
                
            });
            return null;
        }
        ).catch(function (error) {
            functions.logger.info("Error getting documents: ", error);
            // Throw an error
        });
    }
    

    【讨论】:

    • 你说的都是对的。但是,您提供的代码仍然不起作用。打印“这里”后它崩溃了。我的想法是,它至少应该打印“snap,******”然后崩溃。不知道为什么代码表现得很奇怪。
    • 尝试按照此处链接中的建议和代码初始化数据库:firebase.google.com/docs/firestore/quickstart#node.js_1
    • @Abhishek 没有错误信息?如果删除 where 子句 (return admin.firestore().collection("url").get().then(querySnapshot => {) 会发生什么?另外,你能分享你的package.json文件的内容吗(在functions目录下)
    • @Allennick Doing const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); in a Cloud Function 应该没问题,见firebase.google.com/docs/functions/…
    • @RenaudTarnec,在问题中添加了 packages.json 的内容。此外,删除 where 子句不会产生任何错误,并且代码会按预期正常运行。
    【解决方案2】:

    嗯,我发现了问题。有时愚蠢的事情会引起周围的大部分噪音。 我写的不是“array-contains”,而是“array_contains”。

    【讨论】:

    • @Abhisek 很高兴您发现了问题!您可能会赞成我的回答,恕我直言,它帮助您调试代码(请参阅我的 cmets)并分享了一些关于 Cloud Functions 生命周期的关键点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2018-05-06
    • 2013-12-05
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多