我知道在天蓝色存储表中插入实体的不同方法,但我找不到解决方案:
虽然我的函数是由队列触发的,但看起来有时尝试插入的实体已经存在于我的表中。
RowKey 是使用两个具有 4 位数字的数学随机生成的,我知道这可能并不理想,因为相同的数字可能会多次出现,但是您如何管理这种执行?
我使用输出绑定将数据发送到表,虽然这个绑定应该在终止函数进程之前尝试 5 次,但我只尝试了 1 次。(我需要检查任何配置吗?)
是否可以在发生错误时捕获错误并在重新提交之前将 rowkey 增加 1 或更多?如果是的话,你有什么可以让我效仿的例子吗?
使用输出绑定还是 JS sdk 都没有关系。
编辑:我做了一些测试:这是一种工作,但它是合法的吗?
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 (node js sdk)
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"
var a = {
PartitionKey: partkey,
RowKey: rokey,
Name: "ZuzzuS!"
};
tableSvc.insertEntity('TestTable', a, function(error, result, response) {
if(error) {
// Insert table entity error
context.log.error("There was an error!")
} else {
// Insert table entity successfully
}
});
}
这应该给出错误,因为实体存在,而不是函数继续执行并完成而不做任何事情。