You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Cloud Functions-Cloud Firestore报错:无法获取serverTimestamp

解决Cloud Functions中Firestore serverTimestamp获取失败的问题

嘿,我一眼就看出问题出在哪了!你之所以遇到这两个错误,是因为找错了FieldValue/ServerValue的位置——它们并不是你创建的Firestore实例db的属性,而是属于admin.firestore这个静态命名空间的。

错误原因分析

你原来的代码里写了:

var timestamp = db.FieldValue.serverTimestamp(); // 错误
var timestamp = db.ServerValue.TIMESTAMP; // 错误

这里的dbadmin.firestore()初始化出来的实例对象,而FieldValueServerValue是Firebase Admin SDK提供的静态工具类,必须直接从admin.firestore上访问,不能从实例里取,所以才会报“Cannot read property 'xxx' of undefined”的错误。

正确的写法

直接改用admin.firestore.FieldValue.serverTimestamp()(这是当前推荐的写法,适用于较新版本的Admin SDK),如果你的SDK版本比较旧,也可以用admin.firestore.ServerValue.TIMESTAMP

修正后的完整代码如下:

const admin = require('firebase-admin');
exports.userlog = functions.firestore
  .document('user/{userId}')
  .onUpdate((change, context) => {
    const db = admin.firestore();
    // 正确获取服务器时间戳
    const timestamp = admin.firestore.FieldValue.serverTimestamp();
    
    // 注意:这里要确保你正确获取了previousValue
    const previousValue = change.before.data();
    if (!previousValue) {
      return console.log('No previous data found');
    }

    return db.collection('userlog').add({
      userId: previousValue.userId,
      timestamp: timestamp
    }).then(ref => {
      return console.log('Added document with ID: ', ref.id);
    }).catch(err => {
      return console.error('Error adding document: ', err);
    });
  });

额外提示

  1. 建议优先使用FieldValue.serverTimestamp(),因为ServerValue在新版本的SDK中已经逐渐被FieldValue替代,后者的API更统一。
  2. 记得处理可能的异常(比如我上面加的catch块),避免函数因为未捕获的错误崩溃。

内容的提问来源于stack exchange,提问作者Jack Wilson

火山引擎 最新活动