javascript - Node.js Firestore 身份验证问题(当 javascript 工作时)

标签 javascript node.js firebase google-cloud-firestore

我希望匿名连接到 Firestore 并从集合中获取一些数据。这在 javascript 下工作得很好,但在 Node.js 下却失败了(“FirebaseError:缺少或权限不足”)。任何指示将不胜感激。

这是在 javascript 下工作没有任何问题的代码(我省略了“脚本”包含)并且它按预期返回数据:

var config = {
  apiKey: "xxx",
  authDomain: "xxx.firebaseio.com",
  projectId: "xxx",
  storageBucket: "xxx.appspot.com",
};
firebase.initializeApp(config);

firebase.auth().signInAnonymously().catch(function(error) {
  var errorCode = error.code;
  var errorMessage = error.message;
  console.log(error.message);
});

foo();
async function foo() {
  var db=firebase.firestore();
  var query = await db.collection("collection").limit(5).get();
  query.forEach(function(doc) {
    console.log(doc.data());
  });
}

这段代码在 Node.js 下工作。 config/authdata 与上面的 js 示例中的完全相同。 (它使用 firebase(客户端)库。我的理解是 firebase-admin 库不允许匿名登录。)

const firebase=require('firebase');

  var config = {
  apiKey: "xxx",
  authDomain: "xxx.firebaseio.com",
  projectId: "xxx",
  storageBucket: "xxx.appspot.com",
  };

firebase.initializeApp(config);

firebase.auth().signInAnonymously().catch(function(error) {
    var errorCode = error.code;
    var errorMessage = error.message;
    console.log(error.message);
  });

let db = firebase.firestore();

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

调用db.collection('collection').get()时会触发以下错误。 (之前的匿名签名已通过)

Error getting documents { FirebaseError: Missing or insufficient permissions.
    at new FirestoreError (/root/node_modules/@firebase/firestore/dist/index.node.cjs.js:1201:28)
    at JsonProtoSerializer.fromRpcStatus (/root/node_modules/@firebase/firestore/dist/index.node.cjs.js:19708:16)
    at JsonProtoSerializer.fromWatchChange (/root/node_modules/@firebase/firestore/dist/index.node.cjs.js:19955:44)
    at PersistentListenStream.onMessage (/root/node_modules/@firebase/firestore/dist/index.node.cjs.js:16828:43)
    at /root/node_modules/@firebase/firestore/dist/index.node.cjs.js:16757:30
    at /root/node_modules/@firebase/firestore/dist/index.node.cjs.js:16797:28
    at /root/node_modules/@firebase/firestore/dist/index.node.cjs.js:17844:20
    at process._tickCallback (internal/process/next_tick.js:68:7)
  code: 'permission-denied',
  name: 'FirebaseError',
  toString: [Function] }

再次感谢您的指点!

最佳答案

一种可能是您在获取 Firestore 时实际上尚未登录。事实上signInAnonymously()方法是异步的,并且在获取 Firestore 之前您不需要等待此方法返回的 Promise 解析。

因此,以下内容可能会解决您的问题:

firebase.initializeApp(config);
let db = firebase.firestore();

firebase.auth().signInAnonymously()
.then(cred => {
    return db.collection('collection').get()
})
.then((snapshot) => {
    snapshot.forEach((doc) => {
      console.log(doc.id, '=>', doc.data());
    });
})
.catch((err) => {
    console.log(err);
});
<小时/>

请注意,您应该在 JavaScript SDK 版本中执行相同的操作:

firebase.auth().signInAnonymously()
.then(cred => {
  foo();
}}
.catch(function(error) {
  var errorCode = error.code;
  var errorMessage = error.message;
  console.log(error.message);
});

关于javascript - Node.js Firestore 身份验证问题(当 javascript 工作时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61650258/

相关文章:

node.js - 网络推送未知问题,WebPushError "Received unexpected response code"400

swift - 事件指示器不会完成操作

Javascript 过滤器非数组 JSON 对象

javascript - 在浏览器调整大小时重新定位 jQuery UI 自动完成

javascript - 如何在 md-dialog 上叠加 md-dialog

node.js - 运行 Node 应用程序时bcrypt无效的elf header

node.js - 如何在另一个集合上使用某些条件搜索一个 Mongoose 集合?

javascript - 需要具有不同宽度的响应式等高 div 标签

javascript - 无法从 firebase 获取 token 用于消息传递

javascript - firebase.auth 不是函数 - 具有多个 firebase 应用程序初始化