【问题标题】:Executing compound Firestore query in Cloud Functions在 Cloud Functions 中执行复合 Firestore 查询
【发布时间】: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


【解决方案1】:

快速搜索后,您的问题似乎是您使用 firebase-admin 时未提供有效凭据 website

至少从错误代码来看是这样的。

仅 firebase-admin 需要已部署功能的凭据,而 firebase-functions 则不需要。

【讨论】:

  • 错误也显示为列表,因为您在 ForEach 方法中查询电影
猜你喜欢
  • 1970-01-01
  • 2019-08-30
  • 2019-11-01
  • 2023-03-31
  • 2018-03-20
相关资源
最近更新 更多