Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.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
使用Azure Table Storage Node.js界面一次删除多个实体_Node.js_Rest_Azure_Azure Storage_Azure Table Storage - Fatal编程技术网

使用Azure Table Storage Node.js界面一次删除多个实体

使用Azure Table Storage Node.js界面一次删除多个实体,node.js,rest,azure,azure-storage,azure-table-storage,Node.js,Rest,Azure,Azure Storage,Azure Table Storage,我得到的唯一删除操作一次删除一个: 我想要的与SQL语句等效 DELETE FROM MyTable WHERE PartitionKey = 'something' 该页面上还有一种发送批处理的方式(尽管我无法将其用于delete,有人知道为什么吗?)。但是,我首先必须进行选择,以获取要删除的实体列表,以便获取它们的行键。我想知道是否有可能只在一个Azure请求中完成这项工作 提前谢谢 更新:这是我试过的代码,但它不起作用。我已经确认调用函数时所有参数都是正确的 // subAccts al

我得到的唯一删除操作一次删除一个:

我想要的与SQL语句等效

DELETE FROM MyTable WHERE PartitionKey = 'something'
该页面上还有一种发送批处理的方式(尽管我无法将其用于delete,有人知道为什么吗?)。但是,我首先必须进行选择,以获取要删除的实体列表,以便获取它们的行键。我想知道是否有可能只在一个Azure请求中完成这项工作

提前谢谢

更新:这是我试过的代码,但它不起作用。我已经确认调用函数时所有参数都是正确的

// subAccts all have PartitionKey = pKey
function deleteAccount(pKey, rKey, subAccts, callback) {
  var tasks = subAccts; // rename for readability
  tasks.push({ PartitionKey: pKey, RowKey: rKey });
  tableService.beginBatch();
  async.forEach(tasks, function(task, callback) {
    tableService.deleteEntity(myTable, task, function(error) {
      if (!error) {
        callback(null);
      }
      else {
        console.log(error);
        callback(error);
      }
    });
  }, function(error) {
    if (error) {
      console.log(error);
      callback(error);
      return;
    }
    tableService.commitBatch(callback);
  });
}

如果您事先不知道要删除的实体列表,则必须先查询以找到它们

<>你可以考虑重新调整你的表。如果不只是将这些实体放在同一个分区中,您可以将它们全部放在同一个表中(由它们自己),您可以删除该表。这通常用于删除旧日志。。。创建像log_-janur、log_-junur这样的表,然后只需一个命令就可以一次删除整个月份

编辑

库中似乎有一个bug。尝试此编辑作为解决方法:

BatchServiceClient.prototype.addOperation = function (webResource, outputData) {
    if (azureutil.objectIsNull(outputData)) {
        outputData = '';
    }

    if (webResource.httpVerb !== 'GET') {
        webResource.headers[HeaderConstants.CONTENT_ID] = this.operations.length + 1;

        if (webResource.httpVerb !== 'DELETE') {
            webResource.headers[HeaderConstants.CONTENT_TYPE] = 'application/atom+xml;type=entry';
        } else {
            delete webResource.headers[HeaderConstants.CONTENT_TYPE];
        }
...
我已经创建了一个拉请求来修复dev分支中的此问题:


在修复此问题之前,您始终可以克隆my fork()、签出
dev
分支和
npm install
,而不是手动编辑代码。

如果不知道要删除哪些实体,则无法删除实体。这并不意味着你必须先把它们拿来。你能解释一下你遇到的问题吗?我想以最有效的方式删除每个具有给定
PartitionKey
的实体。好的,我先查询它们,现在我有了一个
{PartitionKey,RowKey}
对象数组。使用这种方法,我在链接的页面上尝试了批处理方法,但没有成功。我将
insertEntity
更改为
deleteEntity
,但这是我唯一做的更改。他们的代码看起来错了吗?我可以确认为每个任务调用了
deleteEntity
,并在最后调用了
commitBatch
,但什么都没有发生。看起来一切正常。您是否捕获了HTTP流量(使用Fiddler或类似工具)以查看发生了什么?正在发送HTTP请求吗?响应是什么?嗯,我看到了导致调用上述代码的请求,并且我看到它正确地生成了204代码。但是,我没有看到我预期的
commitBatch
会导致的对Azure的实际HTTP请求。然后我注意到,即使每次删除都执行单独的请求(这确实有效,但速度很慢),我仍然看不到任何对Azure的HTTP请求。对于
deleteEntity
批处理,是否有其他(用户定义的)字段应该无关紧要,对吗?比如,如果我删除
{PartitionKey:'p1',RowKey:'1',Desc:'foo'}
它应该还可以吗?我看不出有什么原因,但现在我已经绝望了,可以考虑任何事情。我想没关系,但是你可以检查代码。