【问题标题】:Set Firebase Timestamp to 2 weeks from today in Node.js Cloud Functions在 Node.js Cloud Functions 中将 Firebase 时间戳设置为从今天起 2 周
【发布时间】:2020-07-25 11:17:45
【问题描述】:

我正在尝试将一个文档存储在我的 Firebase Cloud Firestore 中,它有两个 Timestamp 字段:purchaseDateexpirationDate

purchaseDate 是当前日期,expirationDate 是当前日期后 2 周。

我正在使用post Cloud Functions 请求来设置文档。

我能够像这样实现当前日期(purchaseDate):

const purchaseDate = admin.firestore.Timestamp.now();

但我不知道如何在当前日期后的两周内获得Timestamp

我尝试了多种方式来实现它,包括这个例子,但没有任何效果:

admin.firestore.Timestamp.fromDate(purchaseDate + 12096e5); //12096e5 = 2 weeks in ms

知道如何实现吗?

非常感谢!

【问题讨论】:

    标签: node.js firebase google-cloud-firestore google-cloud-functions


    【解决方案1】:

    一种可能的方法,只需使用Timestamp 的构造函数并将正确的秒数添加到purchaseDate

    const TWO_WEEKS_IN_SECONDS = 14*24*60*60
    
    const purchaseDate = admin.firestore.Timestamp.now()
    const expirationDate = new admin.firestore.Timestamp(
        purchaseDate.seconds + TWO_WEEKS_IN_SECONDS,
        purchaseDate.nanoseconds)
    
    console.log(purchaseDate.toDate())
    console.log(expirationDate.toDate())
    

    当然,这取决于您是否携带纳秒值是否关键。


    您的直接问题是 fromDate 想要一个 Date 对象,而不是 Firestore Timestamp。如果您真的想通过 Date 对象,这也可以为您工作(请注意,这会将您的精度从纳秒降低到毫秒):

    const TWO_WEEKS_IN_MS = 1000*TWO_WEEKS_IN_SECONDS
    const twoWeekOutDate = new Date();
    twoWeekOutDate.setTime(purchaseDate.toDate().getTime() + TWO_WEEKS_IN_MS)
    const alternative = admin.firestore.Timestamp.fromDate(twoWeekOutDate)
    
    console.log(alternative.toDate())
    

    请记住,整个方法只有在(如您所做的那样)发生在 Cloud Functions 等安全上下文中时才真正安全。尽管相同的通用方法适用于客户端,但还有其他安全注意事项,正如Franktheir answer 中所描述的那样。

    【讨论】:

      【解决方案2】:

      虽然robsiemb 中的方法存储了正确的值,但它使用客户端时间戳来执行此操作。这意味着它可能会被恶意用户操纵,如果您没有适当地防范的话。

      这在您的用例中可能完全没问题,但我想留下一些额外的想法和选择:

      1. 当允许客户端代码确定时间戳时,使用 Firebase 的服务器端安全规则来确保存储的日期在合理的范围内。

        例如,您可以在规则中使用request.time 以确保该字段大约是两周后。这可确保恶意用户无法将自己的过期日期设置为比您想要的更长或更短的日期。

      2. 另一种方法是将实际创建日期存储为服务器端时间戳,并单独存储到期interval。这通常使验证数据更容易,但由于您必须同时查询这两个字段,因此查询过期数据会稍微复杂一些。

      3. 另一种选择是让客户端将创建日期写入服务器端时间戳,然后让云函数根据该时间戳使用过期时间戳更新文档。

      【讨论】:

      • 问题提到上下文位于 Cloud Functions 内部(因此,可能是具有适当管理权限的受信任执行)。同样,由于这意味着使用管理 API,任何安全规则 (#1) 都将被忽略。无论如何,你对做类似客户端的问题提出了很好的观点。
      • 好一个@robsiemb,我完全错过了。我仍然会留下选项,因为其他人可能会在这里找到与他们相关的人。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多