【问题标题】:Client SDK and Admin SDK differences in firestore queriesFirestore 查询中的 Client SDK 和 Admin SDK 差异
【发布时间】:2019-07-04 04:59:06
【问题描述】:

在 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')

【问题讨论】:

    标签: typescript firebase google-cloud-firestore google-cloud-functions google-admin-sdk


    【解决方案1】:

    您似乎在 Admin SDK 中遇到了一些 TypeScript 错误。因此,要么您没有在客户端 JavaScript 中使用 TypeScript,要么服务器上的编译器更加严格。无论哪种方式,您都需要解决每个问题,或者也切换到在 Cloud Functions 中使用纯 JavaScript。

    有不少错误,但最常见的似乎是:

    类型“查询”不可分配给类型“CollectionReference”。

    28       ref = ref.where('cafeId', '==', cafe)
    

    你先在这里定义ref

    let ref = firestoreDB.collection('events')
    

    由于collection('events) 返回一个CollectionReferenceref 成为该类型。然后当您稍后尝试将ref.where('cafeId', '==', cafe) 分配给它时,它的类型为QueryCollectionReference 的祖先)。所以这是一个类型错误。

    解决方案是立即将ref 设为Query 类型:

    let ref: Query = firestoreDB.collection('events')
    

    【讨论】:

    • 出于某种原因,即使我设法修复了这些错误,它也没有得到任何结果。查询大小保持为空,而完全相同的查询在客户端返回 10 个项目,有什么想法吗?难道是因为日期对象变成了UTC时间标准?
    • 就是这样。我通过使用 moment.js 将日期对象格式化为更正时区来修复它。 moment(searchQuery.start).tz('Europe/Helsinki').toDate()
    猜你喜欢
    • 2018-07-27
    • 1970-01-01
    • 2019-02-10
    • 2020-12-05
    • 2019-11-26
    • 1970-01-01
    • 2018-09-02
    • 2019-05-16
    • 1970-01-01
    相关资源
    最近更新 更多