【问题标题】:"Error: 13 INTERNAL: An internal error occurred" happened in firebase-function's trigger sometimes“错误:13 内部:发生内部错误”有时发生在 firebase 函数的触发器中
【发布时间】:2020-03-15 22:14:34
【问题描述】:

此触发器用于检测日程中的序列是否已更新,并帮助更新日程的概览状态和完成时间。

但是当发生如下内部错误时,它并不总是有效:

Error: 13 INTERNAL: An internal error occurred. at Object.exports.createStatusError 
(/srv/node_modules/grpc/src/common.js:91:15) at Object.onReceiveStatus 
(/srv/node_modules/grpc/src/client_interceptors.js:1204:28) at InterceptingListener._callNext 
(/srv/node_modules/grpc/src/client_interceptors.js:568:42) at InterceptingListener.onReceiveStatus 
(/srv/node_modules/grpc/src/client_interceptors.js:618:8) at callback 
(/srv/node_modules/grpc/src/client_interceptors.js:845:24)

这是我的代码:

export const calc_status = function.firestore.document("users/{userid}/schedule/{scheduledid}").onUpdate(async (change, context) => {
    // before error occurred ...
    const data = change.after.data();
    let curStatus = data.status;
    ...
    ...

    // after getting occurred ...
    if(data.status !== curStatus ) {
        data.status = curStatus;
        if(curStatus === 'finished') {
            data.finish_time = new Date().toISOString();
        }
        if(curStatus !== 'expired'){
            data.update_time = data.expired_time;
            data.finish_time = data.expired_time;
        } else {
            data.update_time = new Date().toISOString();
        }
        await change.after.ref.update(data);
        return Status.SUCCEEDED;
    }
    return Status.SUCCEEDED;
}

我很困惑为什么会出现这个错误,因为这个功能大部分时间都可以正常工作。

有人遇到和我一样的问题吗?

为什么会发生错误?你的解决方案是什么?

谢谢。

【问题讨论】:

标签: firebase google-cloud-firestore google-cloud-functions


【解决方案1】:

这似乎是长期存在的框架错误github.com/firebase/firebase-functions/issues/536,目前尚未解决。

虽然您无法解决在冷启动时偶尔发生的错误,但您可以通过完整控制台启用retries 来解决此问题,请参阅Retry Cloud Functions for Firebase until it succeeds 以获取说明。

这假设您可以很好地处理代码中的内部错误,因为它将重试任何失败,但在我的情况下,函数 onCreate 处理程序只是通过 PubSub 排队一些稍后的处理,因此任何失败都意味着它应该重试。

2020 年 10 月更新

firebase-functions 的 v3.11 开始,您现在可以通过将 failurePolicy 设置为 true 在功能代码中设置重试模式

module.exports = functions.runWith({ failurePolicy: true }).firestore.document('collection/doc').onWrite(async (change, context) => {
  //do function stuff
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 2016-10-15
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    相关资源
    最近更新 更多