首页 > 解决方案 > Firebase Cloud Function 不会在函数中终止:shell

问题描述

我正在尝试将 JSON 导入到集合中。出于测试目的,我正在使用模拟器和文档创建触发器。

工作流程是:

  1. 启动模拟器firebase emulators:start
  2. 在另一个终端中启动函数 shell firebase functions:shell(告诉我没有模拟器正在运行 btw)
  3. 调用我的函数tempoCF()
  4. 它运行并将文档添加到集合中,但该功能似乎没有终止。我不能调用另一个函数,需要按下CTRL+C才能在 shell 中再次写入。

这是我使用的功能:

const functions = require("firebase-functions");
const admin = require('firebase-admin');
const fetch = require('node-fetch');

admin.initializeApp();

const db = admin.firestore();

exports.tempoCF = functions
    .firestore.document('/tempo/{docId}')
    .onCreate(async (snap, context) => {
        console.log("onCreate");

        let settings = { method: "Get" };

        let url = "https://opendata.paris.fr/api/records/1.0/search/?dataset=sanisettesparis&q=&rows=-1";
        try {
            let response = await fetch(url, settings);
            let json = await response.json();
            // TODO for each json object, add new document
            return Promise.all(json["records"].map(toiletJsonObject => {
                console.log(toiletJsonObject);
                return db.collection('toilets').doc(toiletJsonObject["recordid"]).set({});
            }));
        }
        
        catch(error) {
            console.log(error);
            return null;
        }
    }
    );

我知道我可以使用模拟器 UI 创建一个触发 tempoCF 功能的新文档,它也可以正常工作,但我担心我的功能不正确并且可能会在生产中产生错误。

这是终端的屏幕截图。它打印日志,最后,无法在屏幕截图的最后一个空行上写任何内容。我在 Android Studio 中运行它,但我认为这并不重要。 贝壳不给我手

标签: firebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


我不在 Windows 上,而是在 Mac 上,我可以通过调用函数在终端中重现您的问题tempoCF()。不知何故,通过这样做,您正在模拟创建一个没有数据的 Firestore 文档。

但是如果我在调用云函数时传递了一些数据,例如tempoCF({foo: "bar"})(即为onCreate操作提供新的测试数据),我可以在 CF 完成后写入终端。有关更多详细信息,请参阅文档


推荐阅读