【发布时间】:2020-05-06 22:10:08
【问题描述】:
我正在编写一些在电影和用户的 Firestore 数据库上工作的触发器。 在此触发器中,我试图向新用户显示他选择的类型列表中评分最高的电影。为此,我有一系列他最喜欢的流派,我想在 foreach 循环中查询数据库:
import * as functions from 'firebase-functions';
import { __values } from "tslib";
import * as admin from 'firebase-admin';
admin.initializeApp();
const films = admin.firestore().collection("Films");
export const new_user_recommend = functions.firestore
.document('/Users/{email}')
.onCreate((snap, context) => {
const new_user = snap.data();
if(new_user){
const new_email = new_user.email;
const favourite_genres = new_user.favourite_genres;
let film_id_arr: string[] = new Array();
favourite_genres.forEach((genre: string) => {
films.where('genres', 'array-contains', genre).orderBy('avg_rating', 'desc').limit(5).get()
.then((list_book: any)=>{
list_book.forEach((element: any) => {
const film_element = JSON.parse(element.data());
film_id_arr.push(film_element.data().id);
});
return film_id_arr;
})
.catch((error: any)=>{
console.log(error);
console.log("Error loading films");
});
});
}
return 0;
});
问题是我总是在 catch 子句中收到错误消息(因此对于数组中的每种类型,我都会收到错误消息)。我再次检查以确保数组中的字符串与每个电影文档的“流派”字段中可能写入的字符串相同。 这让我相信我的查询在某种程度上是不正确的。是这样吗?
我编辑以添加一些重要的细节。我得到的确切错误是“无法加载默认凭据”,那么这是否表明用户身份验证而不是查询本身存在问题?
【问题讨论】:
-
error对象告诉你什么?你应该记录它。另请记住,如果您在 Cloud Functions 中运行它,您可能需要更好地处理此代码中的 Promise。另外我不确定这如何被视为“复合”查询。您现在拥有的查询数量与类型相同。 -
你能澄清一下你记录它的意思吗?我看到了我在 console.log() 命令中写的错误消息(“加载影片时出错”)。我在这里的承诺处理还有什么问题?这不是函数的完整代码,因为我想保持简单,所以我可能已经在做你认为我应该做的事情
-
您的 catch 函数正在传递一个
error参数。这将告诉你更多关于什么是错的。这是标准的 JavaScript 错误处理。 -
好的。抱歉打扰了,我是新手。我记录了错误对象,它给了我“无法加载默认凭据”
-
这听起来像是您应该将信息放入问题本身,包括您部署的整个函数代码。请编辑问题以解释发生了什么问题。
标签: node.js typescript firebase google-cloud-firestore google-cloud-functions