无法按日期从 Google Cloud Pub/Sub 功能中的 Firebase 获取文档

Posted

技术标签:

【中文标题】无法按日期从 Google Cloud Pub/Sub 功能中的 Firebase 获取文档【英文标题】:Unable to fetch documents by date from Firebase in Google Cloud Pub/Sub Function 【发布时间】:2020-08-15 10:17:15 【问题描述】:

我有一个 pub/sub 函数正在运行,当它被触发时,它会从今天 date 所在的 Firebase 集合中获取所有文档。

在本地(非pubsub)节点环境中测试代码,运行正常,但是发布时找不到任何文档,但在本地版本中可以。

我猜这与传递的日期有关,但我不明白为什么它可以在本地工作,但不能在这个 pub/sub 函数中工作?

export const check_orders = functions.pubsub.schedule('0 9 * * *').timeZone('Europe/London').onRun(async context => 

     const currentDate = moment();
     currentDate.set(hour: 0, minute: 0, second: 0, millisecond: 0);
     console.log('currentDate:', currentDate);

     const toDate = currentDate.toDate();
     console.log('toDate:', toDate);

     const currentDateTimestamp = admin.firestore.Timestamp.fromDate(currentDate.toDate());
     console.log('currentDateTimestamp:', currentDateTimestamp);

     const query = db.collection('orders').where('delivery.delivery_due', '==', toDate).where('user_status', '==', 'active');
     const tasks = await query.get();

...

当这个被触发时,currentDate 将记录:moment("2020-05-01T00:00:00.000")

我还尝试将toDate() 添加到currentDate,这将记录2020-05-01T00:00:00.000Z。也找不到任何文件。

添加了另一个测试,将日期转换为输出 Timestamp _seconds: 1588291200, _nanoseconds: 0 的 Firebase 时间戳,但仍不获取任何文档。

如果我在本地测试中循环执行上述代码,我会返回 1 个文档,但 pub/sub 不会返回任何文档。测试仅删除获取status = active 的文档并且它是成功的,所以它肯定与日期有关。

测试文档delivery_due日期设置为今天,user_status设置为active,所以文档中的数据与预期一致。

我错过了什么吗?

【问题讨论】:

可能是currentDate和你本地版本不一样? 您是否尝试过在游戏中记录日期变量以查看它们是否符合您的预期?在不知道这一点的情况下,我们不知道您的查询是否真的会找到您正在寻找的东西 - 一切都隐藏在我们看不到的变量和文档字段后面。 @DougStevenson 很抱歉,用日期输出和正在检查的数据的屏幕截图更新了问题。 【参考方案1】:

您的时区差异有问题。您从时刻开始的日期以 UTC 衡量(这就是“Z”在记录的 currentDate 字符串末尾的含义),但时间戳字段中的日期以 UTC+1 衡量。他们都说“午夜”,但由于他们在不同的时区,他们指的不是同一时间,所以你的查询不匹配。

您需要注意确保在查询和文档中使用准确同一时刻。我建议还看一下在时间戳中插入日期的代码,以使其与查询所需的内容相匹配。

【讨论】:

以上是关于无法按日期从 Google Cloud Pub/Sub 功能中的 Firebase 获取文档的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Function - ImportError:无法从“google.cloud”(未知位置)导入名称“pubsub”

ImportError:无法从“google.cloud”(未知位置)导入名称“bigquery”

ImportError:无法从“google.cloud”导入名称“tasks_v2”

无法从 Data Fusion 连接 Cloud SQL mySql 实例。异常“无法创建套接字工厂 'com.google.cloud.sql.mysql.SocketFactory”

Google Cloud Tasks 无法向 Cloud Run 进行身份验证

Bigquery 无法从 Google Cloud Storage 加载数据