无法按日期从 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”