Firebase 可调用函数。 Promise 在客户端返回 null (Cloud Functions)
Firebase callable functions. Promise is returning null on the client ( Cloud Functions )
我开发了这个 firebase 函数来 return 来自我的应用程序搜索 ( elastic ) 的数据。当我在功能控制台上登录时,我可以看到请求数据,我也可以在我的 App Search API 日志中看到响应正文。但是我无法在客户端获取数据
响应正文
{
"meta": {
"alerts": [],
"warnings": [],
"precision": 2,
"page": {
"current": 1,
"total_pages": 1,
"total_results": 2,
"size": 10
},
"engine": {
"name": "engine",
"type": "default"
},
"request_id": "DF4VEuzuQpWAHH8VCBkvDg"
},
"results": [
{
"nome": {
"raw": "Produto legal"
},
"_meta": {
"engine": "engine",
"score": 0.8957006,
"id": "bnxvuzVXIQ4BxqHxjvgt"
},
"id": {
"raw": "bnxvuzVXIQ4BxqHxjvgt"
}
},
{
"nome": {
"raw": "Produto massa"
},
"_meta": {
"engine": "engine",
"score": 0.3164503,
"id": "rdG192xjSVCLIEBNg0la"
},
"id": {
"raw": "rdG192xjSVCLIEBNg0la"
}
}
]
}
Firebase 函数
exports.searchProdutos = functions.https.onCall((data, context) => {
const options = {
search_fields: { nome: {} },
result_fields: { nome: { raw: {} } },
};
const query = data.query;
client
.search("engine", `${query}`, options)
.then((response) => {
return response;
})
.catch((error) => console.log(error.errorMessages));
});
但是当我尝试在客户端中调用它并记录响应时,我在控制台中记录了两个空对象
客户端函数调用
const searchProdutos = httpsCallable(functions, "searchProdutos");
const getProdutos = async () => {
const results = await searchProdutos({ query: "produto" });
console.log(results.data);
};
getProdutos();
附加信息:我在我的函数中使用 Nodejs App Search 并作为我的前端做出反应library/framework
编辑: 我也收到了 200 响应。所以我想这个请求没有错。我尝试从我的客户端函数中删除 .then 但我仍然得到 data: {null}
两次
我正在为这个话题发布一个社区 Wiki 答案,以便为未来的用户提供一个解决方案。基于 Kevin B 在 chatroom thread, there is a problem 中的评论以及调用您的 Firebase 函数的客户端代码。当您的客户端代码使用 then
语句记录响应时,此 then
语句不是 return 响应,而是 undefined
值,这使得响应在记录。
此外,服务器端 Firebase 函数不会 return 在 client.search()
函数中返回给客户端应用程序的承诺。基于聊天室 comments,您的 Firebase 函数应该 return 来自 client.search()
的响应。
我开发了这个 firebase 函数来 return 来自我的应用程序搜索 ( elastic ) 的数据。当我在功能控制台上登录时,我可以看到请求数据,我也可以在我的 App Search API 日志中看到响应正文。但是我无法在客户端获取数据
响应正文
{
"meta": {
"alerts": [],
"warnings": [],
"precision": 2,
"page": {
"current": 1,
"total_pages": 1,
"total_results": 2,
"size": 10
},
"engine": {
"name": "engine",
"type": "default"
},
"request_id": "DF4VEuzuQpWAHH8VCBkvDg"
},
"results": [
{
"nome": {
"raw": "Produto legal"
},
"_meta": {
"engine": "engine",
"score": 0.8957006,
"id": "bnxvuzVXIQ4BxqHxjvgt"
},
"id": {
"raw": "bnxvuzVXIQ4BxqHxjvgt"
}
},
{
"nome": {
"raw": "Produto massa"
},
"_meta": {
"engine": "engine",
"score": 0.3164503,
"id": "rdG192xjSVCLIEBNg0la"
},
"id": {
"raw": "rdG192xjSVCLIEBNg0la"
}
}
]
}
Firebase 函数
exports.searchProdutos = functions.https.onCall((data, context) => {
const options = {
search_fields: { nome: {} },
result_fields: { nome: { raw: {} } },
};
const query = data.query;
client
.search("engine", `${query}`, options)
.then((response) => {
return response;
})
.catch((error) => console.log(error.errorMessages));
});
但是当我尝试在客户端中调用它并记录响应时,我在控制台中记录了两个空对象
客户端函数调用
const searchProdutos = httpsCallable(functions, "searchProdutos");
const getProdutos = async () => {
const results = await searchProdutos({ query: "produto" });
console.log(results.data);
};
getProdutos();
附加信息:我在我的函数中使用 Nodejs App Search 并作为我的前端做出反应library/framework
编辑: 我也收到了 200 响应。所以我想这个请求没有错。我尝试从我的客户端函数中删除 .then 但我仍然得到 data: {null}
两次
我正在为这个话题发布一个社区 Wiki 答案,以便为未来的用户提供一个解决方案。基于 Kevin B 在 chatroom thread, there is a problem 中的评论以及调用您的 Firebase 函数的客户端代码。当您的客户端代码使用 then
语句记录响应时,此 then
语句不是 return 响应,而是 undefined
值,这使得响应在记录。
此外,服务器端 Firebase 函数不会 return 在 client.search()
函数中返回给客户端应用程序的承诺。基于聊天室 comments,您的 Firebase 函数应该 return 来自 client.search()
的响应。