更新后无法删除 azure storage queue 消息(找不到消息)

Can't delete azure storage queue message after it has been updated (Message not found)

为 node.js、azure-storagefast-azure-storage 使用了两个不同的库,结果相同。

这是我的做法:

  1. 使用默认设置创建消息 - 可以。
  2. 从 queue 获取消息 - 好的。
  3. 更新消息以重置 visibility timeout - 好的。
  4. 处理后删除邮件 - 错误:MessageNotFound。

如果我跳过更新,一切都会很顺利。

那我做错了什么?

P.S。试着分析了一下http流量,好像完全符合docs。这是 Azure 内部问题吗? 也许有人有使用其他语言库更新消息的经验?由于计算身份验证 header,该服务对 curl 太不方便 header。

你说的 "Update message to reset visibility timeout" 是什么意思?您是否将隐身超时设置为零?如果是这样,则预计会出现第 4 步中的错误,因为您不允许 delete 当前可见的消息。

作为文件Delete Message mentions, the function requires the parameter popreceipt which is returned by Get Messages or Update Message运行。

并且更新消息操作后,此消息的popreceipt发生变化。因此,如果您的代码片段如下所示:

queueSvc.getMessages('myqueue', function(error, result, response){
  if(!error){
    // Messages retreived
    for(var index in result){
      var message = result[0];
      queueSvc.updateMessage('myqueue', message.messageid, message.popreceipt, 0, {messageText: 'new text'}, function(error, result, response){
          if(!error){
            // Message updated successfully
            console.log('result: '+JSON.stringify(result));
            console.log(message.popreceipt)
            queueSvc.deleteMessage('myqueue', message.messageid, message.popreceipt, function(error, response){
                if(!error){
                    console.log(response);
                  // Message deleted
                }else{
                    console.log(error);
                }
              });
          }else{
            console.log(error);
          }
        });
    }
  }
});

你会出现你的问题,你可以在 cmdlet 中监控,我们发现 popreceipt 在更新操作后发生了变化。

所以如果你需要在更新操作后删除消息,你必须利用 result 对象,它是 updating.E.g.

之后的新消息对象
queueSvc.deleteMessage('myqueue', result.messageid, result.popreceipt, function(error, response){
            if(!error){
                console.log(response);
              // Message deleted
            }else{
                console.log(error);
            }
          });