【问题标题】:How can I create a new document in CosmosDB with a delete pre-trigger?如何使用删除预触发器在 CosmosDB 中创建新文档?
【发布时间】:2017-11-28 07:28:22
【问题描述】:

我尝试在 Azure 门户中使用脚本资源管理器在 CosmosDB 中实现删除预触发器(触发器类型为“Pre”,触发器操作为“Delete”)。我想做的是通过使用已删除的文档并将其“pastDue”属性更改为true来创建一个新文档。从我的收藏中删除文档后,我看不到任何更改。

谁能告诉我我做错了什么?如何查看触发器是否成功执行?

    function markReminderAsPastDue() {
      var collection = getContext().getCollection();
      var request = getContext().getRequest();
      var docToCreate = request.getBody();
      docToCreate["pastDue"] = true;
      collection.createDocument(collection.getSelfLink(),
            docToCreate,
            function (err, documentCreated) {
                if (err) throw new Error('Error' + err.message);       

        });
    }

这是我用来从我的数据库处理程序类中的任何集合中删除任何文档的函数:

removeItem (item, partitionKey, callback)
{
    var options = {
        partitionKey: [ partitionKey ? partitionKey: item.email]
    };
    this.client.deleteDocument(item._self, options,
        (err, doc) => {
            if (err)
            {
                LogUtils.error("DBHandler.removeItem "+err.body);
                callback(err, null);
            }
            else
            {
                callback(null, "success remove Item");
            }
        });
} 

【问题讨论】:

  • 删除文档时是否在请求选项中指定 preTriggersInclude?触发器不是自动调用的,需要在每个需要触发器的请求中明确指定。还要确保检查 collection.createDocument 的返回值,如下所示: var isAccepted = collection.createDocument(...); if (!isAccepted) throw new Error("not accepted");

标签: javascript azure azure-cosmosdb


【解决方案1】:

根据您的描述,您需要先在portal上或使用Document DB SDK创建Pre-Trigger。

Trigger Type 应该是 Pre,Trigger Operation 应该是 Delete。

根据我的经验,我们需要在操作中明确指定触发器才能激活触发器。目前,Azure 门户似乎不支持它。

您需要在 RequestOptions 参数中指定要在操作之前调用的触发器。 不知道你用的是什么语言,这里参考java代码的sn-p如下:

RequestOptions options = new RequestOptions();
//enable script logging  true
options.setScriptLoggingEnabled(true);
List<String> list = new ArrayList<String>();
list.add("test");
options.setPreTriggerInclude(list);

documentClient.deleteDocument("dbs/db/colls/coll/docs/400", options);

System.out.println("delete success");

另外,你可以参考帖子:Trigger in DocumentDb not fired?

希望对你有帮助。


更新答案:

我发现您没有在 RequestOptions 参数中指定要调用的触发器。请修改代码中的选项如下:

var options = {
        partitionKey: [ partitionKey ? partitionKey: item.email],
        preTriggerInclude: "<your pre-trigger's id >"
    };

触发功能如下:

function trigger(){
    var context = getContext();
        var request = context.getRequest();
        var collection = getContext().getCollection();

        var documentToCreate = request.getBody();
        documentToCreate["pastDue"] = true;
        documentToCreate["id"] = "";
        collection.createDocument(collection.getSelfLink(),documentToCreate);

}

【讨论】:

  • @user3127584 您是通过 SDK 还是在门户上删除了文档?目前,Azure 门户似乎不支持它。
  • 感谢您的回复杰。我上面分享的代码 sn-p 是用 JavaScript 编写的。我已在 Azure 门户中使用脚本资源管理器来创建此触发器。其触发类型为“Pre”,触发操作为“Delete”。从关联集合中删除文档后,由于触发器,我看不到新文档。所以它似乎没有被解雇。
  • 我使用 Node.js SDK 从同样位于 Azure 云的 Web 应用程序中删除了文档。
  • @user3127584 方便分享一下你删除文档的sn-p代码让我帮你解决这个问题吗?
  • 我已经在描述区分享了上面的删除功能。由于评论字段的字符限制,我无法在这里写它。
猜你喜欢
  • 2019-11-06
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多