Node.js Azure功能和Azure存储-实体已存在-节点

Node.js Azure功能和Azure存储-实体已存在-节点,node.js,azure-storage,azure-table-storage,azure-sdk-js,Node.js,Azure Storage,Azure Table Storage,Azure Sdk Js,我了解在azure存储表中插入实体的不同方法,但我找不到解决方案: 虽然我的函数是由队列触发的,但看起来有时试图插入的实体已经存在于我的表中 RowKey是使用两个4位数的数学随机数生成的,我知道这可能不理想,因为同一个数字可能会出现多次,但如何管理这种执行 我使用输出绑定将数据发送到表,虽然在终止函数进程之前,这个绑定应该尝试5次,但我只尝试了1次。(我需要检查任何配置吗?) 是否可以在发生错误时捕获错误,并在重新提交之前将rowkey增加1或更多?如果是的话,你有什么可以让我效仿的例子吗 这

我了解在azure存储表中插入实体的不同方法,但我找不到解决方案:

虽然我的函数是由队列触发的,但看起来有时试图插入的实体已经存在于我的表中

RowKey是使用两个4位数的数学随机数生成的,我知道这可能不理想,因为同一个数字可能会出现多次,但如何管理这种执行

我使用输出绑定将数据发送到表,虽然在终止函数进程之前,这个绑定应该尝试5次,但我只尝试了1次。(我需要检查任何配置吗?)

是否可以在发生错误时捕获错误,并在重新提交之前将rowkey增加1或更多?如果是的话,你有什么可以让我效仿的例子吗

这是通过输出绑定还是JSSDK完成的并不重要

编辑: 我做了一些测试: 这是一种工作,但它是合法的

var azure = require('azure-storage');
var tableSvc = azure.createTableService(process.env.AzureWebJobsStorage);

module.exports = async function (context, myQueueItem) {
    context.log('JavaScript queue trigger function processed work item', myQueueItem);

    var partkey = "Test"
    var rokey = 39


    try {
        context.bindings.outputTable = [];
        context.bindings.outputTable.push({

            PartitionKey: partkey,
            RowKey: rokey,
            Name: "Test"
        });
    } finally {
        context.bindings.outputTable = [];
        context.bindings.outputTable.push({

            PartitionKey: partkey,
            RowKey: rokey + 1,
            Name: "Test"
        });
    }
}
现在有40个,如果我再次运行,同样会在finally上再次停止,因为直到解决为止不会循环

我应该在进入新实体之前查询表(有大量条目)以检查键是否存在吗?这不会花很长时间吗

非常感谢你的帮助

编辑1: 我一直在读到,我无法真正捕获执行时的输出绑定错误,因此我尝试使用tableservice(NodeJSSDK)


由于实体存在,因此这将产生错误,而函数将继续执行并完成,而不执行任何操作。

关于此问题,您可以使用方法
insertOrMergeEntity
。如果实体不存在,该方法将插入该实体。否则,该方法将通过将新属性值合并到实体中来更新表中的实体。有关更多详细信息,请参阅

此外,如果您只想执行插入操作,请参考以下代码

var azure = require("azure-storage");
var accountName = "andyprivate";
var accountKey =
  "h4pP1fe76m8hdksFW3TvkO6hgw09Mjue7yJOnULPI/g2eU8LGJ+a6k6SrU6dUkOU77waZfU8CacyVMlTWAUA5A==";
var tableSvc = azure.createTableService(accountName, accountKey);

var entGen = azure.TableUtilities.entityGenerator;
module.exports = async function (context, myQueueItem) {
  context.log(
    "JavaScript queue trigger function processed work item",
    myQueueItem
  );

  var partkey = "Test";
  var rokey = 29;
  var task = {
    PartitionKey: entGen.String(partkey),
    RowKey: entGen.String(String(rokey)),
    description: entGen.String("take out the trash"),
  };

  try {
    const r = await insert("test", task);
  } catch (error) {
    if (error.code == "EntityAlreadyExists") {
      context.log(error);
     // insert 
    }
  }
};

async function insert(tableName, entity) {
  return new Promise((resolve, reject) => {
    tableSvc.insertEntity(tableName, entity, (error, result) => {
      if (error) {
        reject(error);
      } else {
        resolve("OK");
      }
    });
  });
}


您好,谢谢您的建议,因为我不需要更换,我无法使用insertOrReplace,因为我们希望对发生的情况进行某种记录。如果实体不存在,你的代码将插入实体,否则我猜只会跳过它。我可以添加其他行键重试的内容吗?@varVal您可以将插入操作添加到代码
if(error.code==“EntityReadyExists”){context.log(error);}
@varVal例如
if(error.code==“EntityReadyExists”){context.log(error);task={PartitionKey:entGen.String(partkey),RowKey:entGen.String(),description:entGen.String(“取出垃圾”),};等待插入(“测试”,任务);
var azure = require("azure-storage");
var accountName = "andyprivate";
var accountKey =
  "h4pP1fe76m8hdksFW3TvkO6hgw09Mjue7yJOnULPI/g2eU8LGJ+a6k6SrU6dUkOU77waZfU8CacyVMlTWAUA5A==";
var tableSvc = azure.createTableService(accountName, accountKey);

var entGen = azure.TableUtilities.entityGenerator;
module.exports = async function (context, myQueueItem) {
  context.log(
    "JavaScript queue trigger function processed work item",
    myQueueItem
  );

  var partkey = "Test";
  var rokey = 29;
  var task = {
    PartitionKey: entGen.String(partkey),
    RowKey: entGen.String(String(rokey)),
    description: entGen.String("take out the trash"),
  };

  try {
    const r = await insert("test", task);
  } catch (error) {
    if (error.code == "EntityAlreadyExists") {
      context.log(error);
     // insert 
    }
  }
};

async function insert(tableName, entity) {
  return new Promise((resolve, reject) => {
    tableSvc.insertEntity(tableName, entity, (error, result) => {
      if (error) {
        reject(error);
      } else {
        resolve("OK");
      }
    });
  });
}