Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Azure函数-写入表输出绑定时处理错误_Javascript_Azure_Azure Functions - Fatal编程技术网

Javascript Azure函数-写入表输出绑定时处理错误

Javascript Azure函数-写入表输出绑定时处理错误,javascript,azure,azure-functions,Javascript,Azure,Azure Functions,我有一个Azure函数设置,它是。它的触发器设置为服务总线队列消息。当函数被触发时,消息将以某种方式处理。如果在处理过程中遇到任何异常,我将处理该错误,并将消息作为输出绑定保存在Azure表存储集中,以用于日志记录 我想处理在向输出绑定写入内容时抛出的任何错误。我该怎么做呢 错误的详细信息 我在写入输出绑定(表存储)时遇到的一个错误是某个键的值无法保存。例如,消息中的一个键是time,其值类型为number。在写入此数据时,我遇到了一个异常,即键的值不能放入Int32number。我认为tabl

我有一个Azure函数设置,它是。它的触发器设置为服务总线队列消息。当函数被触发时,消息将以某种方式处理。如果在处理过程中遇到任何异常,我将处理该错误,并将消息作为输出绑定保存在Azure表存储集中,以用于日志记录

我想处理在向输出绑定写入内容时抛出的任何错误。我该怎么做呢

错误的详细信息

我在写入输出绑定(表存储)时遇到的一个错误是某个键的值无法保存。例如,消息中的一个键是
time
,其值类型为number。在写入此数据时,我遇到了一个异常,即键的值不能放入
Int32
number。我认为table storage试图在默认情况下将数字转换为
Int32
,但失败了。为了解决这个问题,我将所有键转换为字符串值。现在我可以省钱了

但我仍然希望在写入表存储输出绑定时处理任何不可预见的错误

在这种情况下,处理错误很重要,因为如果服务总线消息没有正确使用,则消息不会在服务总线队列中删除,并且在Azure函数执行完成后,该消息再次触发函数,函数进入无限循环。

下面是Azure函数的示例

module.exports = async function (context, mySbMsg) {
    try{
        // process service bus message
        await processMsg(mySbMsg);
    } catch(e) {
        // if processing fails, save the message in Azure table
        try{
            // my own try to handle errors, but was unsuccessful
            await new Promise(function (resolve, reject) {
                context.bindings.tableBinding = [];
                context.bindings.tableBinding.push({
                    PartitionKey: mySbMsg.id|| "unknown",
                    RowKey: time + "",
                    errorMessage: e.message || "",
                    ...mySbMsg
                })
                resolve();
            });
        } catch (e) {
            // do something HERE;
            // exception on output binding didn't brought me here
        }
    }
    context.done();
}

输入和输出绑定在函数范围之外执行,这就是为什么不能在函数内输入catch块。如果要捕获错误,可以自己处理对存储器的写入,而不是使用输出绑定

但是,如果未能写入存储器,则服务总线队列将不会触发无限循环中的函数。服务总线限制重试次数,一旦达到该限制,消息将移动到单独的死信队列以避免无限循环。其中的消息不会过期-它们将一直存在,直到您准备好处理或删除它们

默认的最大传递计数为10,您可以在队列的刀片属性上配置此值

至于处理死信队列中的消息,我发现这非常有用。这使得查看DLQ中的消息非常简单,然后将它们推回到主队列或删除它们


您还可以通过编程方式访问DLQ,并构建自动化系统来处理这些消息。但是,由于消息无处可去,如果DLQ处理程序无法解析消息,您可能会陷入循环。

感谢您提供的详细答案。很高兴知道它不会进入无限循环。我应该更仔细地阅读这些文件。