gpt4 book ai didi

node.js - 使用在 Firestore 模拟器上运行的 Firebase-Admin 时找不到 Firestore 文档

转载 作者:行者123 更新时间:2023-12-04 14:14:24 24 4
gpt4 key购买 nike

当我在客户端 上使用firebase.firestore() 时,以下函数运行良好并设法找到文档:

使用 firebase.firestore()

function getUserProfile(email, returnDoc) {
var db = firebase.firestore();
var docRef = db.collection("Users").doc(email);

docRef.get().then(function (doc) {
if (doc.exists) {
returnDoc(undefined, doc);
} else {
returnDoc("User not found.", doc);
}
}).catch(function (error) {
returnDoc("Error getting user.", doc);
});
};

关于 index.js

getUserProfile(user.email, function (err, userProfile) {
if (!err) {
$scope.firstName = userProfile.get("FirstName");
$scope.lastName = userProfile.get("LastName");
$scope.email = userProfile.get("Email");
$scope.$apply();
} else {
alert(err);
};
});

但是当我尝试使用 firebase-admin 创建另一个类似的函数时,以下函数无法找到具有相同电子邮件 的文档> 参数:

db.js中用admin.firestore()

const admin = require('firebase-admin');  
admin.initializeApp();

let db = admin.firestore();

function getUserData(email, returnDoc) {
console.log(`imtp-db.getUserData: ${email}`); // email data is correct and exist in database.

let docRef = db.collection("Users").doc(email);

return docRef.get().then(function (doc) {
console.log(`doc.exists: ${doc.exists}`); // doc.exists: false here.
if (doc.exists) {
console.log("Document data:", doc.data());

return returnDoc(undefined, doc);
} else {
return returnDoc("User not found.", doc);
};
}).catch(function (error) {
return returnDoc("Error getting user.", doc);
});
};

exports.getUserData = getUserData;

在云函数中:

const functions = require('firebase-functions');
const db = require("./middleware/db.js");

exports.getUserProfile = functions.https.onCall((data, context) => {
var userProfile = undefined;
console.log(`data.email = ${data.email}`);
return db.getUserData(data.email, function (err, userDoc) {
console.log(`exports.getUserProfile.err = ${err}`);
if (!err) {
userProfile = userDoc.data();
return {
error: err,
returnData: userProfile
};
} else {
return {
error: err,
returnData: userProfile
};
};
});
});

除了 doc.exists 始终评估为 false 并始终返回 “未找到用户”之外,上述函数中的一切都运行良好且没有错误。,为什么?我在第二版代码中做错了什么?谢谢!

注意:我正在运行所有模拟器:firebase emulators:start

最佳答案

引用this post ,显然,答案很简单:本地 Firestore 模拟器没有数据。基于问题中完全相同的代码,可以使用以下方法轻松证明这一点:

启动除 Firestore 模拟器之外的所有模拟器:

  1. firebase serve --only hosting
  2. firebase 模拟器:start --only functions

现在文档可以访问并且doc.exists == true:

enter image description here

如果不启动 Firestore 模拟器,代码将被迫使用数据 访问生产服务器。当然,不建议这样做,尤其是当您使用 Blaze Plan 时。因此,如 above link 中给出的那样,我们应该在使用 Firestore 模拟器之前在本地设置测试数据。

至于客户端firebase.firestore()之所以能够访问到数据,是因为Firestore Emulator运行在与主机不同的端口上。因此,在 web 客户端index.js 中执行的 firebase.firestore() 使用的是 localhost:5000,绕过 Firestore 模拟器,直接进入生产服务器。为解决此问题,此 Firebase Documentation可能是解决方案(但尚未测试):

// Initialize your Web app as described in the Get started for Web
// firebaseApp previously initialized using firebase.initializeApp().
var db = firebaseApp.firestore();
if (location.hostname === "localhost") {
db.settings({
host: "localhost:8080",
ssl: false
});
}

关于node.js - 使用在 Firestore 模拟器上运行的 Firebase-Admin 时找不到 Firestore 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61889238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com