【问题标题】:Firebase from Node: no response from callback?来自 Node 的 Firebase:回调没有响应?
【发布时间】:2020-05-20 11:27:31
【问题描述】:

我正在尝试让 Hello World 在这里工作——只需让我的 Node 脚本与 Firebase 对话即可。我制作了一个我认为应该阅读“故事”集合的脚本,但我没有收到 Firebase 的任何回复。我确定我错过了一些非常基本的东西。请帮忙!

var db = admin.database();
var ref = db.ref("stories");

ref.on("value", function(snapshot) {
  console.log(snapshot.val());
}, function (errorObject) {
  console.log("The read failed: " + errorObject.code);
});
console.log('exiting');

...但我得到的是:

p:0: Browser went online.
p:0: Listen called for /stories default
exiting
p:0: Making a connection attempt
p:0: Auth token refreshed
getToken() completed. Creating connection.
c:0:0: Connection created
c:0:0:0 Websocket connecting to wss://*****.firebaseio.com/.ws?v=5

我想办法等待更长时间,结果得到了这个:

p:0: Browser went online.
p:0: Listen called for /stories default
exiting
p:0: Making a connection attempt
p:0: Auth token refreshed
getToken() completed. Creating connection.
c:0:0: Connection created
c:0:0:0 Websocket connecting to wss://*****.firebaseio.com/.ws?v=5
c:0:0: Closing unhealthy connection after timeout.
c:0:0: Closing realtime connection.
c:0:0: Shutting down all connections
c:0:0:0 WebSocket is being closed
p:0: data client disconnected
p:0: Trying to reconnect in 0ms
0: onDisconnectEvents
p:0: Making a connection attempt
getToken() completed. Creating connection.
c:0:1: Connection created
c:0:1:0 Websocket connecting to wss://*****.firebaseio.com/.ws?v=5
c:0:0:0 Websocket connection was disconnected.

我做错了什么?

【问题讨论】:

  • Cloud Firestore 和实时数据库是完全独立的数据库。请仅使用与您的问题相关的标签。我现在为你修好了,但最好你自己做,这样我们就可以专注于帮助更多的人。
  • 您的 Node.js 脚本似乎在从 Firebase 获取数据之前就退出了。请注意,在console.log(snapshot.val()); 之前看到您的exiting 日志是正常的,因为后者是一个异步回调。你在哪里运行这段代码?
  • @FrankvanPuffelen:我只是在本地机器上的命令行中执行“node foo.js”。

标签: node.js firebase firebase-realtime-database firebase-admin


【解决方案1】:

您谈到了collection,所以我认为您正在开发 Cloud Firestore,而不是实时数据库。 所以代码应该是:

const db = admin.firestore();
db.collection('stories').get()
    .then((snapshot) => {
        snapshot.forEach((doc) => {
            console.log(doc.id, '=>', doc.data());
        });
    })
    .catch((err) => {
        console.log('Error getting documents', err);
    });

请看这张图片: enter image description here

【讨论】:

  • 谢谢!那不是必须是 db.collection('colName').doc('docName').get() 吗?
  • 您可以使用它来获取文档的详细信息。 db.collection('stories').get() -> 它返回 stories 文档的所有文档的 Promise。 db.collection('colName').doc('docName').get()。 -> 它返回单个文档(docName)的 Promise。因此,如果您只想获取文档的详细信息并且知道其 docName,请使用它
【解决方案2】:

Tru once() 而不是 on()once() 只查询一次并返回一个承诺。 on() 建立一个监听器,在你移除它之前一直运行,它不会返回一个 Promise。

ref.once('value')
.then(snapshot => {
    console.log(snapshot.val());
})
.catch(error => {
    console.error(error);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多