Firebase云函数:未被调用



我有一个简单的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

我看不到日志,这意味着该功能没有被触发。注意:

  1. 我已验证"requests/{userId}"是有效的文档路径
  2. 我已经验证了允许写入的规则

我无法再现"不被称为";问题,但我看到了另一种错误。但首先,我能够使您的代码使用一个安全规则,该规则只允许授权用户在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
});

相关内容

  • 没有找到相关文章

最新更新