我有一个简单的firestore触发器,定义如下:index.js
const func = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();
exports.addFriend = func.firestore
.document("/requests/{userId}")
.onCreate((snap, context) => {
const original = snap.data().original;
// let toUID=original['sentRequests'];
// let fromUID=userID;
func.logger.log("context params", context.params, original);
return snap.ref.set(original);
});
但是,在使用命令进行部署时。
firebase deploy --only functions
我看不到日志,这意味着该功能没有被触发。注意:
- 我已验证"requests/{userId}"是有效的文档路径
- 我已经验证了允许写入的规则
我无法再现"不被称为";问题,但我看到了另一种错误。但首先,我能够使您的代码使用一个安全规则,该规则只允许授权用户在requests
:上添加和更新数据
service cloud.firestore {
match /databases/{database}/documents {
match /requests/{userId} {
allow create, update: if request.auth.uid != null;
}
}
}
在一个单独的测试应用程序上,我使用以下代码插入数据:
async function addData() {
const data = {
original: 'foobar',
};
const res = await db.collection('requests').add(data); // doc ID is auto-generated
console.log(`added ${JSON.stringify(data)} with doc ID ${res.id}`);
}
代码的logger
部分按预期工作,但是,return snap.ref.set(original)
将导致错误,因为您在其中传递的是String值,而不是Object:
错误:参数的值"数据";不是有效的Firestore文档。输入不是一个普通的JavaScript对象。
若要解决此问题,您需要传递包含要更新快照的字段和值的对象。使用set()
将覆盖快照。如果您不希望发生这种情况,请使用update()
:
return snap.ref.update({
"newField" : original
});