Firestore中基于参数的条件where子句

时间:2019-01-22 14:20:48

标签: typescript google-cloud-firestore google-cloud-functions

例如,我的产品列表具有动态过滤器列表,从该过滤器列表将https请求发送到云功能。然后尝试根据该请求设置多个条件where子句

多个条件where子句在本地Firebase应用中有效,但在云功能内部不起作用  -更新代码-

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
import { Query } from "@google-cloud/firestore"; // update code
const cors = require("cors")({
  origin: true
});
admin.initializeApp();

const settings = { timestampsInSnapshots: true };
admin.firestore().settings(settings);

const database = admin.firestore();

export const getProduct = functions.https.onRequest(
  (request, response) => {
    return cors(request, response, async () => {
      try {
        let productRef = database.collection("product") as Query; // update code
        if(request.query.brand){
          productRef =productRef.where("brand", "==", request.query.brand)
        }
        if(request.query.lifeStyle){
          productRef =productRef.where("lifeStyle", "==", request.query.lifeStyle)
        }
        const productsQuery = await productRef.get();

        const products = productsQuery.docs.map(
          docRef => ({
            id: docRef.id,
            ...docRef.data()
          })
        );
        response.status(200).send(products);
      } catch (error) {
        response.status(500).send(error);
      }
  });
 }
);

在控制台上编译显示错误后 [ts]类型“查询”不可分配给类型“ CollectionReference”。 [2322]

1 个答案:

答案 0 :(得分:1)

TypeScript抱怨您正在尝试更改productRef的类型。您首先要给productRef分配调用collection()的结果。从链接的API文档中,您可以看到它返回了CollectionReference类型的对象。然后,您尝试通过调用where()的结果来重新分配productRef,该调用将返回不同的类型Query。 TypeScript不希望您更改变量的类型。

由于CollectionReference是Query的子类,因此您可以只告诉TypeScript您想在整个时间内将productRef作为查询来处理:

let productRef = database.collection("product") as Query

请注意此处的强制转换。