我是javascript / nodeJS的新手。我正在尝试实现一个http firebase云函数,该函数在其主体中接收userID。收到后,我需要调用firestore的getDocument函数并获取其对应的数据,使用这些数据进行操作,然后在http cloud函数响应中发送回客户端。
我的代码如下,我在邮递员中得到了空响应。但是我可以在服务器日志中注意到,在Firestore中的以下语句getDocument打印正确的数据。
console.log('Document data:', user);
但是,当我在http cloud函数中打印相同的数据时,该数据为空。
console.log('User data:', user);
根据我的理解,即使firestore获取了实际数据,http云函数也会在检索这些实际数据之前发送其响应,从而导致响应为空。
欣赏您的见解。预先感谢!
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
let db = admin.firestore();
var getRequestedUserDetails = function (userId, db) {
var user;
var cityRef = db.collection('users').doc(userId);
var getDoc = cityRef.get()
.then(doc => {
if (!doc.exists) {
console.log('No such document!');
return user;
} else {
user = doc.data();
console.log('Document data:', user);
return user;
}
})
.catch(err => {
console.log('Error getting document', err);
throw new Error('Error getting document', err);
});
return user;
}
exports.helloWorld = functions.https.onRequest((request, response) => {
if (request.method !== "POST") {
response.status(400).send('Invalid HTTP Request');
return;
}
userId = request.body.userId;
var user = getRequestedUserDetails(userId, db);
console.log('User data:', user);
response.send(user);
});
答案 0 :(得分:0)
get()
是异步的,并立即以承诺返回,该承诺将在以后的查询结果中解决一些未知时间。函数getRequestedUserDetails
在定义之前将返回user
。相反,也许您的函数还可以返回在查询结果时解析的promise,并且调用方可以使用then()
来接收其结果并发送响应。