最近我的Firebase云函数经常出错。特别是当用户发布帖子并将帖子复制到用户所有追随者的提要集合时触发的功能。
我的代码是这样的:
exports.onCreatePost = functions.firestore
.document("/Posts/{userId}/UserPosts/{postId}")
.onCreate(async (snapshot, context) => {
const postCreated = snapshot.data();
const userId = context.params.userId;
const postId = context.params.postId;
// 1) Get all the followers of the user who made the post
const followerRef = admin
.firestore()
.collection("Followers")
.doc(userId)
.collection("FollowerIds");
return followerRef.get().then((querySnapshot) => {
querySnapshot.forEach((doc) => {
const followerId = doc.id;
admin
.firestore()
.collection("Feed")
.doc(followerId)
.collection("FeedPosts")
.doc(postId)
.set(postCreated);
});
return null;
});
});
直到最近,函数一直运行良好,但现在有些人有100个追随者,函数经常失败,有2个错误:
错误:进程已退出,代码为16
错误:超过4个截止日期:超过截止日期
我知道第一个错误意味着已经发送了一些类似头的信息,但我不知道我的函数有什么问题。我也知道firebase有一些写限制,但功能基本上只是向每个关注者提要集合中添加一个文档,所以我认为写限制不应该受到影响。
要总结我的数据库结构:
>
Feed(集合)userId(文档)FeedPosts(子集合)postId(文档)
Followers(集合)userId(文档)FollowerIds(子集合)FollowerIds(文档)
Posts(集合)userId(文档)UserPosts(子集合)postId(文档)
exports.onCreatePost = functions.firestore.document("/Posts/{userId}/UserPosts/{postId}").onCreate(async (snapshot, context) => {
const postCreated = snapshot.data();
const userId = context.params.userId;
const postId = context.params.postId;
// 1) Get all the followers of the user who made the post
const followerRef = await admin.firestore().collection("Followers").doc(userId).collection("FollowerIds").get();
const promises = [];
followerRef.forEach((doc) => {
const followerId = doc.id;
promises.push(admin.firestore().collection("Feed").doc(followerId).collection("FeedPosts").doc(postId).set(postCreated)}));
});
await Promise.all(promises);
});
});
一旦请求得到满足,云功能就会收回资源。因此,必须先使用wait来检索数据。请阅读有关async/Wait的更多信息
您错误地管理了云功能的生命周期。在调用异步方法的后台云函数中返回promise,会告诉云函数平台在清理函数之前,等待promise得到履行或拒绝。看见https://firebase.google.com/docs/functions/terminate-functions更多细节。
由于在foreach()
循环中,您正在执行对异步set()
方法的可变数量的调用,因此需要使用Promise.all()
以获得唯一的Promise(当调用set()
方法返回的所有promise都已解决时,该方法将解析,然后您可以返回这些promise,如下所示:
exports.onCreatePost = functions.firestore.document("/Posts/{userId}/UserPosts/{postId}").onCreate(async (snapshot, context) => {
const postCreated = snapshot.data();
const userId = context.params.userId;
const postId = context.params.postId;
const followersQuerySnapshot = await admin.firestore().collection("Followers").doc(userId).collection("FollowerIds").get();
const promises = followersQuerySnapshot.docs.map( // followersQuerySnapshot.docs is an Array of QueryDocumentSnapshots
doc => admin
.firestore()
.collection("Feed")
.doc(doc.id)
.collection("FeedPosts")
.doc(postId)
.set(postCreated)
);
return Promise.all(promises); // <= Important, here return the promise returned by Promise.all()
});
});
我试图从firebase CLI(8.12.1版)部署我的一个功能,但它一直失败。这个功能已经好几个星期没变了,所以我有点困惑为什么它现在失败了。 来自CLI的错误 函数[http api-(europe-west1)]:部署错误。生成失败:生成错误详细信息不可用。请在查看日志https://console.cloud.google.com/logs/viewer?project= 来自云控制台的
我已经在我的web服务器中配置了apache_exporter以公开度量,普罗米修斯将从中获取度量。它在除启用了apache http身份验证(AuthType)的公共服务器之外的所有服务器上都能工作。如果启用了http身份验证,如何使用prometheus进行刮取。
✔功能:功能文件夹上传成功 我正在开始发布过程(可能需要几分钟)... i函数:正在创建函数FollowerNotification. 其他一切工作都没有问题。只有当我试着用Firebase Firestore做东西的时候。
问题内容: 我有桌子 当我尝试运行此查询时: 错误代码:1292。第1行“ data_apertura”列的日期值错误:“ 01-05-2012” * 我要改变什么?(我试图将格式的日期从gg / mm / yyyy更改为gg-mm-yyyy,但未进行任何更改) 问题答案: 以以下格式示例插入日期,
1.grpc@1.20.0安装/users/me/desktop/appname/appname/functions/node_modules/grpc node-pre-gyp安装--fallback-to-build--library=static_library node-pre-gyp使用needle警告node-pre-gyp https下载 3.../ext/channel.cc:29
我使用织物节点js客户端调用链码,我可以查询链码,但当我试图提交事务时,我得到了错误。 结构版本1.4.3 使用fabric客户端节点js 未能提交事务:错误:未能在截止日期前连接URL:grpcs://xx.xx.xxx:7050 在我的连接json中,我使用了GRPC设置keepalive_timeout_ms,但我仍然面临上述错误