typescript - Firestore 查询中的 Client SDK 和 Admin SDK 差异
问题描述
在 Firebase Functions 中运行查询时,我无法正常工作。它在客户端完美运行,但在函数中却不行。想知道是否有办法让它与 Admin SDK 一起工作。我的查询做错了什么?
参数:
searchQuery = {
start:
"[native Date Fri Feb 08 2019 00:00:00 GMT+0200 (Itä-Euroopan normaaliaika)]",
end:
"[native Date Fri Feb 08 2019 23:59:59 GMT+0200 (Itä-Euroopan normaaliaika)]",
cafeIds: ["LI088001"],
textSearch: "",
time: { time: "00-24", label: "Kokopäivä" }
}
sort = {
"column": "created",
"value": "asc"
}
询问:
let ref = firestoreDB.collection('events')
ref = ref.where('created', '>=', searchQuery.start).where('created', '<=', searchQuery.end)
for (const cafe of searchQuery.cafeIds) {
ref = ref.where('cafeId', '==', cafe)
}
ref = ref.where(`time.${searchQuery.time.time}`, '==', true)
if (searchQuery.textSearch !== '') {
ref = ref.where(
'products.',
'array-contains',
lowerCase(searchQuery.textSearch)
)
}
if (sort.field === 'created') {
ref = ref.orderBy('created', sort.value)
} else if (sort.field === 'productCount') {
ref = ref
.orderBy('created', 'asc')
.orderBy('productCount', sort.value)
} else if (sort.field === 'total') {
ref = ref
.orderBy('created', 'asc')
.orderBy('total', sort.value)
} else {
ref = ref.orderBy('created', 'asc').orderBy('eventId', 'asc')
}
const query = await ref.limit(10).get()
将相同的代码放入用 typescript 编写的函数时,出现以下错误:
src/storage/exportCsv.f.ts:25:5 - error TS2322: Type 'Query' is not assignable to type 'CollectionReference'.
Property 'id' is missing in type 'Query'.
25 ref = ref.where('created', '>=', searchQuery.start).where('created', '<=', searchQuery.end)
~~~
src/storage/exportCsv.f.ts:28:7 - error TS2322: Type 'Query' is not assignable to type 'CollectionReference'.
28 ref = ref.where('cafeId', '==', cafe)
~~~
src/storage/exportCsv.f.ts:31:5 - error TS2322: Type 'Query' is not assignable to type 'CollectionReference'.
31 ref = ref.where(`time.${searchQuery.time.time}`, '==', true)
~~~
src/storage/exportCsv.f.ts:34:7 - error TS2322: Type 'Query' is not assignable to type 'CollectionReference'.
34 ref = ref.where(
~~~
src/storage/exportCsv.f.ts:42:7 - error TS2322: Type 'Query' is not assignable to type 'CollectionReference'.
42 ref = ref.orderBy('created', sort.value)
~~~
src/storage/exportCsv.f.ts:44:7 - error TS2322: Type 'Query' is not assignable to type 'CollectionReference'.
44 ref = ref
~~~
src/storage/exportCsv.f.ts:48:7 - error TS2322: Type 'Query' is not assignable to type 'CollectionReference'.
48 ref = ref
~~~
src/storage/exportCsv.f.ts:52:7 - error TS2322: Type 'Query' is not assignable to type 'CollectionReference'.
52 ref = ref.orderBy('created', 'asc').orderBy('eventId', 'asc')
解决方案
看起来您在 Admin SDK 中遇到了一些 TypeScript 错误。因此,要么您没有在客户端 JavaScript 中使用 TypeScript,要么服务器上的编译器更加严格。无论哪种方式,您都需要解决每个问题,或者也切换到在 Cloud Functions 中使用纯 JavaScript。
有很多错误,但最常见的错误似乎是:
类型“查询”不可分配给类型“CollectionReference”。
28 ref = ref.where('cafeId', '==', cafe)
你先在这里定义ref
:
let ref = firestoreDB.collection('events')
由于collection('events
) 返回一个CollectionReference
,ref
成为该类型。然后当您稍后尝试分配ref.where('cafeId', '==', cafe)
给它时,它是类型Query
(的祖先CollectionReference
)。所以这是一个类型错误。
解决方案是立即制作ref
类型Query
:
let ref: Query = firestoreDB.collection('events')
推荐阅读
- javascript - PG-Promise Proc 出错,参数类型未知
- python - ModuleNotFoundError:没有名为“six.moves.collections_abc”的模块
- video-intelligence-api - 人脸检测模型返回空字典(Google Cloud Video Intelligence)
- three.js - 如何在 Three.js 中存储贴花并加载它们?
- javascript - 为什么我的 js for 循环没有按我预期的方式工作?
- java - 通过 HTTP 向 graphQL api 站点 WikiCSMoney 发送请求并在 Java 中获取 JSON 响应
- android - 在系统终止之前,Android 应用程序可以在后台运行多长时间(已关闭电池优化)?
- c - “如果值可以用新类型表示”是什么意思?
- firebase - Firebase 身份验证不允许使用前 10 个密码
- svg - SVG:如何减少仅风格不同的重复对象?