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; // 错误
这里的db是admin.firestore()初始化出来的实例对象,而FieldValue和ServerValue是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); }); });
额外提示
- 建议优先使用
FieldValue.serverTimestamp(),因为ServerValue在新版本的SDK中已经逐渐被FieldValue替代,后者的API更统一。 - 记得处理可能的异常(比如我上面加的
catch块),避免函数因为未捕获的错误崩溃。
内容的提问来源于stack exchange,提问作者Jack Wilson




