DocumentDB:bulkImport存储过程 - 在Array / JSON问题上获得400错误

时间:2017-12-11 08:08:24

标签: json node.js azure-cosmosdb

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

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

  

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

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

我的代码(使用documentdb-util for async):

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”, User-Agent:“win32 / 10.0.16299 Nodejs / v8.9.0 documentdb-nodejs-s ...”, x-ms-date:“星期一,2017年12月11日07:32:29 GMT”, 接受: “应用/ JSON” 授权:myauth 的Cache-Control: “无缓存” 内容类型:“应用/ JSON” User-Agent:“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-版本: “二〇一七年十一月一十五日”

路径 “/ DBS / MYDB / colls / MYCOLL /存储过程/ myBulkInsert”

PARAMS

数组(3)[对象,对象,对象] 长度:3

0:对象{id:“0001”,输入:“donut”,名称:“Cake”,...}

1:对象{id:“0002”,输入:“donut”,名称:“Raised”,...}

2:对象{id:“0003”,输入:“donut”,名称:“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
}]

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我遇到了同样的问题。我能够通过Stringify the Array让它工作并在存储过程中解析它。我在github上打开了一个问题,该代码也来自于此。以下是对我有用的。祝你好运。

---- Stringify Array

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,'\\"') + '"')

答案 2 :(得分:1)

以下代码在调用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中传递partion键