我有这个nodejs应用程序,我所做的调用之一是upsert调用,它将请求正文更新插入到mongodb。如果请求正文存在于 mongo 中,则更新它,否则插入它。插入部分工作正常,但是,我在更新插入部分时遇到问题。我的请求正文是由我编写的 C# 应用程序生成的。
好的,所以当我更新时,我需要使用 $addToSet 和 $each 命令,因为我要将元素添加到 mongo 文档中的数组中。
这是一个示例请求正文(这是一个 POST),这是发送到我的 Nodejs 应用程序的内容:
{
"$addToSet": {
"Data": {
"$each": [
{"ID":"10","RandNum":"45"},
{"ID":"11","RandNum":"1"},
{"ID":"12","RandNum":"3"}
]
}
}
}
该文档在 mongo 中的格式如下:
{
"Timestamp": "timestamp",
"Id": "12345",
"Header": {
"Name": "Name",
"Query": "SELECT * FROM test"
},
"Data": [
{
"ID": "1",
"RandNum": "34"
}, {
"ID": "4",
"RandNum": "23"
}
]
}
我只对插入“Data”数组感兴趣,因此我使用 $addToSet 和 $each 运算符。
这是我对 Nodejs 应用程序的 upsert 调用,实际函数有很多代码,所以我只放置 upsert 部分:
var db = require('../db.js');
var ind = require('./index.js');
var mongo = require('mongodb').MongoClient;
exports.upsert = function(req, res) {
var token = req.params.token;
var app = req.params.applicationId;
var dataObject = {
"Status": 1,
"DataObject": {},
"UserFriendlyErrorMessage": "",
"DeveloperErrorMessage": ""
};
// set response header
res.writeHead(200, {"Content-Type": "application/json"});
res.writeHead(200, {"Content-Length": Buffer.byteLength(req.body)});
var upsertDatabase = mongo.connect(ind.mongoLoc + databaseName, function(err, newDb) {
if(err)
throw err;
var upsertCollection = newDb.collection(collectionName);
if(newDb) {
if(req.query.query) {
// UPSERT
try {
var json = JSON.parse(req.query.query);
upsertCollection.update(json, req.body, {upsert: true, multi: false}, function(err, records) {
if(err)
throw err;
console.log("Data updated");
});
} catch(e) {
dataObject["DataObject"] = null;
dataObject["UserFriendlyErrorMessage"] = "Could not update";
dataObject["DeveloperErrorMessage"] = e;
res.end(JSON.stringify(dataObject, 0, 4));
console.log(e);
}
} else {
// INSERT
upsertCollection.insert(req.body, function(err, records) {
if(err)
throw err;
console.log("Data inserted");
});
}
dataObject["Status"] = 0;
dataObject["DataObject"] = null;
res.end(JSON.stringify(dataObject, 0, 4));
} else {
// could not connect to database
dataObject["DataObject"] = null;
dataObject["UserFriendlyErrorMessage"] = "Could not connect to database";
dataObject["DeveloperErrorMessage"] = "ERROR: Could not connect to database";
res.end(JSON.stringify(dataObject, 0, 4));
}
});
};
在此函数中,我正在测试文档是否存在,如果存在则更新插入。这就是我关注的部分。 dataObject 是我返回给用户以显示错误/成功的内容。
当我将数据发布到此调用时,出现此错误(我正在 Fiddler 中查看 POST 调用):
HTTP/1.1 504 Fiddler - Receive Failure
Date: Fri, 28 Feb 2014 15:30:39 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
Cache-Control: no-cache, must-revalidate
Timestamp: 10:30:39.535
[Fiddler] ReadResponse() failed: The server did not return a response for this request.Server returned 0 bytes
Content-Type 应该是 application/json
最佳答案
我修好了。看来是行了
res.writeHead(200, {"Content-Length": Buffer.byteLength(req.body)});
不允许它发布数据。我尝试删除它并且更新插入起作用了。
但是,我想知道为什么删除它会成功。我认为 Content-Length 是必要的,因为它指定了正文的长度。
关于javascript - 输入错误意外结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22099177/