【问题标题】:DocumentDB: bulkImport Stored Proc - Getting 400 Error on Array/JSON issueDocumentDB:bulkImport Stored Proc - 在 Array/JSON 问题上出现 400 错误
【发布时间】:2017-12-11 08:08:23
【问题描述】:

我只是试图为 documentDB API 执行标准示例 bulkImport sproc,但我似乎无法将对象数组传递给它。我总是收到 400 个错误尽管文档给出了发送对象数组的明确方向 ..非常令人沮丧。

附加细节:即使我将数组包装在一个对象中,该数组具有“items”属性下的数组并将其包含在我的存储过程中,它仍然会出错,说相同的错误请求,需要是一个对象或 JSON 序列化.当我尝试在发送之前执行 JSON.stringify(docs) 时,它无法在另一端解析。

错误请求:文档正文必须是表示 JSON 序列化对象的对象或字符串。

bulkInsert.js: https://github.com/Azure/azure-documentdb-js-server/blob/master/samples/stored-procedures/BulkImport.js

我的代码(使用 documentdb-util 进行异步):

execProc(docs, insertProc);
async function execProc(docs, insertProc){
    let database = await dbUtil.database('test');
    let collection = await dbUtil.collection(database, 'test');
    let procInstance = await dbUtil.storedProcedure(collection, insertProc);
    try{
        let result = await dbUtil.executeStoredProcedure(procInstance, docs);
        console.log(result);
    } catch(e){
        console.log(e.body)
    }  
}

标题

对象 {Cache-Control: "no-cache", x-ms-version: "2017-11-15", 用户代理:“win32/10.0.16299 Nodejs/v8.9.0 documentdb-nodejs-s…”, x-ms-date: "2017 年 12 月 11 日星期一 07:32:29 GMT", 接受:“应用程序/json” 授权:myauth 缓存控制:“无缓存” 内容类型:“应用程序/json” 用户代理:“win32/10.0.16299 Nodejs/v8.9.0 documentdb-nodejs-sdk/1.14.1” x-ms-date:"2017 年 12 月 11 日星期一 07:32:29 GMT" x-ms-version:"2017-11-15"

路径 "/dbs/myDB/colls/myColl/sprocs/myBulkInsert"

参数

Array(3) [对象,对象,对象] 长度:3

0:Object {id: "0001", type: "donut", name: "Cake", ...}

1:Object {id: "0002", type: "donut", name: "Raised", ...}

2:Object {id: "0003", type: "donut", name: "Old Fashioned", ...}

[{
    "id": "0001",
    "type": "donut",
    "name": "Cake",
    "ppu": 0.55
},
{
    "id": "0002",
    "type": "donut",
    "name": "Raised",
    "ppu": 0.35
},
{
    "id": "0003",
    "type": "donut",
    "name": "Old Fashioned",
    "ppu": 0.25
}]

【问题讨论】:

    标签: json node.js azure-cosmosdb


    【解决方案1】:

    “docs”必须是参数数组的数组,否则,过程执行器会将它们视为过程的多个参数,而不是单个数组参数。

    【讨论】:

    【解决方案2】:

    以下代码在调用 storedProcedure 以传递数组类型的参数时起作用。

    JS:

    var docs = [{'id':1},{'id':2}];
    executeStoredProcedure(proc, [docs])
    

    C#

    var docs = new[] {new MyDoc{id=1, source="abc"}, new MyDoc{id=2, source="abc"}];
    
    dynamic[] args = new dynamic[] {docs};
    
    ExecuteStoredProcedureAsync<int>(
       procLink,
       new RequestOptions {PartitionKey = new PartitionKey("abc")},
       args);
    

    注意:您必须确保 'docs' 具有相同的分区键,并在 RequestionOptions 中传递分区键

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。我能够通过对数组进行字符串化并在存储过程中对其进行解析来使其工作。我在 github 上打开了一个问题,该问题也是该代码的来源。以下是对我有用的。祝你好运。

      ---- 字符串化数组

      var testArr = []
      for (var i = 0; i < 50; i++) {
          testArr.push({
              "id": "test" + i
          })
      }
      var testArrStr = JSON.stringify(testArr)
      
      //pass testArrStr to stored procedure and parse in stored procedure
      ---- Slightly altered original BulkImport
      
      exports.storedProcedure = {
          id: "bulkImportArray",
          serverScript:function bulkImportArray(docs) {
              var context = getContext();
              var collection = context.getCollection();
              var docsToCreate = JSON.parse(docs)
              var count = 0;
              var docsLength = docsToCreate.length;
              if (docsLength == 0) {
                  getContext().getResponse().setBody(0);
              }
              var totals = ""
              function insertDoc(){ 
                  var msg = " count=" + count+" docsLength=" +docsLength + " typeof docsToCreate[]=" + typeof docsToCreate+ " length =" + docsToCreate.length
                  if(typeof docsToCreate[count] != 'undefined' ) { 
      
                      collection.createDocument(collection.getSelfLink(),
                          docsToCreate[count],
                          function (err, documentCreated) {
                              if (err){
                              // throw new Error('Error' + err.message);
                              getContext().getResponse().setBody(count + " : " + err);
                              }else{ 
                                if (count < docsLength -1) { 
                                      count++;    
                                      insertDoc();
                                      getContext().getResponse().setBody(msg);
                                  } else { 
                                      getContext().getResponse().setBody(msg);
                                  }
                              }
                          });
                       }else{ 
                           getContext().getResponse().setBody(msg);
                       }    
      
              }
              insertDoc()
          }
      }
      

      如果你想在门户脚本资源管理器中测试它,我必须创建一个转义字符串,即

      var testArr = []
        for(var i=200; i<250; i++){
          testArr.push({"id":"test"+i})
        }
        var testArrStr = JSON.stringify(testArr)
         console.log('"'+testArrStr.replace(/\"/g,'\\"') + '"')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-25
        • 1970-01-01
        • 2017-04-28
        • 2012-01-23
        • 1970-01-01
        • 2015-02-03
        • 2018-04-01
        • 1970-01-01
        相关资源
        最近更新 更多