我希望匿名连接到 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/