javascript - 为什么我的节点脚本在 Cloud Firestore 查询后等待 60 秒才能终止?
问题描述
当我从命令行 ( node script.js
) 运行此脚本时,它似乎工作正常。Firestore 中的所有活动都会打印到控制台,然后是“完成”。但随后脚本不会立即退出。它挂了整整 60 秒,然后我得到了我的提示。那是怎么回事?
更新:是的,这是整个脚本。
const firebase = require('firebase')
const config = {
apiKey: 'AIzaSyBmauMItX-bkUO1GGO_Nvrycy1Y6Pj1o_s',
authDomain: 'fir-test-app-501b1.firebaseapp.com',
databaseURL: 'https://fir-test-app-501b1.firebaseio.com',
projectId: 'fir-test-app-501b1',
}
firebase.initializeApp(config)
firebase.firestore().collection('activities')
.get()
.then(qs => qs.docs.forEach(doc => console.log(doc.data())))
.then(() => console.log('done.'))
我正在使用 Node v8.11.3 和 Firebase v5.11.1。GitHub链接:https ://github.com/danbockapps/firebase60
解决方案
干得好:
var firebaseApp = firebase.initializeApp(config);
var database = firebase.firestore();
database.collection('activities')
.get()
.then(qs => qs.docs.forEach(doc => console.log(doc.data())))
.then(() => {
console.log('done.');
firebaseApp.delete();
// database.disableNetwork(); // Another way to do this, though not as clean
});
设法深入研究集合上的 .get() 调用的代码,并看到 AsyncQueue 中存在 60 秒的超时,该超时在所有操作完成后仍然存在。认为某处必须有一个断开开关,该开关会短路该谷歌库运行的内部计时器,并在 firebaseApp.delete() 中找到它,根据其文档执行以下操作:
(方法)firebase.app.App.delete():承诺
使此应用程序无法使用并释放所有相关服务的资源。
这适用于 5.11.1 和 6.0.4,我强烈建议您在项目初期进行升级。我使用的是 npm 包 firebase-admin 而不是像您正在使用的 firebase,并且不需要调用免费资源。
推荐阅读
- r - 如何同时向两个方向旋转?
- javascript - TextBox 和 Button 未在一行中以相等的间距对齐
- html - 我可以在电子邮件中创建链接以自动发送包含原始电子邮件中特定信息的电子邮件吗?
- php - 最后一个 elseif 语句在 PHP 中不起作用
- wordpress - 如何将页面的所有子项传递给 wordpress 的“is_page”函数?
- scala - 如何在函数中模拟函数调用?
- macos - 使用自制软件在 macOS 上安装 smlnj 不起作用
- reference - 变量的值模型只能和静态类型一起使用,不能和动态类型一起使用吗?
- c# - 如何将对象内的属性列表转换为对象列表
- r - R在多个data.frames之间循环并为它们赋值