首页 > 解决方案 > 为什么我的 Firebase 脚本挂在终端上?

问题描述

我正在编写一个脚本来自动更新firebase,因为我需要每周运行一次

我有一个 index.js 文件,我正在node index.js运行它,一切都很好

我已经注释掉了很多代码,但现在我只是在运行

const calculateWinnings = () => {
    console.log('called me!')
    return firebaseApp
        .database()
        .ref(`data`)
        .once('value')
        .then((snapshot) => {
            console.log('snaph::', snapshot.val())
            return
        })
}


calculateWinnings()

这是我所期望的,它正在运行函数并从firebase返回数据

但是,脚本挂起并且永远不会在终端中退出并显示光标标记

当我注释掉firebase的东西时,它会达到我的预期

所以我想知道如何成功退出脚本或为什么它挂起?我要兑现承诺,所以它应该解决?

标签: javascriptnode.jsfirebasefirebase-realtime-database

解决方案


Firebase SDK 在后台线程中执行所有网络和磁盘活动。calculateWinnings()返回时,实际上then((snapshot) => {还没有调用。出于这个原因,程序还没有退出是件好事,否则你永远不会看到console.log('snaph::', snapshot.val()).

通过强制程序退出,您可以看到这一点:

const calculateWinnings = () => {
    console.log('called me!')
    return firebaseApp
        .database()
        .ref(`data`)
        .once('value')
        .then((snapshot) => {
            console.log('snaph::', snapshot.val())
            return
        })
}

calculateWinnings()
process.exit();

如果你像这样运行它,你会看到数据库中的快照永远不会被记录。

这也是如何正确处理它的答案:因为您已经once()从您的calculateWinnings方法中返回了 Promise,您可以等待它完成然后告诉进程退出:

calculateWinnings().then(() => {
  process.exit();
});

或者,如果您使用的是更现代的 Node.js 版本:

const calculateWinnings = async () => {
  ... the function body is the same as you currently have
}

await calculateWinnings()
process.exit();

推荐阅读