我只是尝试为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
}]
答案 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键