我正在编写一个Node.JS应用程序中的问题。 我正在尝试将JSON字符串作为POST并将该JSON保存到mongodb。
插入工作正常,但我无法处理负责与mongodb交互的代码片段中的错误情况。
E.g。在下面的代码片段中,当达到相应的条件时,我在服务器.js中的“错误”评论#1,3,4中得到预期的404响应,但是评论#2的404响应未到来。
但是,我在评论#5和6中从 insertintomongo.js 在控制台中输出错误,并且该错误对象也成功发送回server.js。
我无法弄清楚为什么响应未设置为404,即使我知道代码已经进入正确的 if 条件(如控制台输出所示)。
JS处理请求的片段( server.js )
var imongo=require("./insertintomongo.js");
http.createServer(function (request, response) {
if (uri == "/ssd/add" && request.method == 'POST') {
console.log(request.method + " to " + request.url);
var fullBody = '';
request.on('data', function(chunk) {
fullBody += chunk.toString();
});
request.on('end', function() {
try {
JSON.parse(fullBody);
} catch (e) {
// Error 1
console.log('Invalid JSON. Error message: ' +e);
response.writeHead(404, "Input data is not in JSON format" , {'Content-Type': 'text/html'});
response.end('<html><head><title>Input data is not in JSON format</title></head><body><h1>Input data is not in JSON format</h1></body></html>');
}
var inputJSON = JSON.parse(fullBody);
if ( inputJSON.deployment_id != undefined ){
inputJSON._id=inputJSON.deployment_id;
imongo(inputJSON,function(err){
if(err){
// Error 2
console.log('Error 2: ' + err);
response.writeHead(404, "Error saving input data" , {'Content-Type': 'text/html'});
response.end('Error inside callback');
} else {
console.log("All good");
};
});
} else {
// Error 3
console.log("Incorrect json provided");
response.writeHead(404, "Incorrect json provided", {'Content-Type': 'text/html'});
response.end('<html><head><title>Incorrect json provided</title></head><body><h1>Incorrect json provided.</h1><h3>"deployment_id" field is missing.</h3></body></html>');
};
// OK 1
response.writeHead(200, "OK", {'Content-Type': 'text/html'});
response.end();
});
} else {
// Error 4
response.writeHead(405, "Method not supported", {'Content-Type': 'text/html'});
response.end('<html><head><title>Method not supported</title></head><body><h1>Method not supported.</h1></body></html>');
}
}).listen(8081);
insertintomongo.js ,包含在上面的JS
中var mongodb = require('mongodb');
var MongoClient = mongodb.MongoClient;
var url = 'mongodb://localhost:27017/mytest';
function saveToMongo(input,cb){
MongoClient.connect(url, function (err, db) {
if (err) {
// Error 5
console.log('Unable to connect to the mongoDB server. Error:', err);
cb(err);
} else {
var collection = db.collection('users');
collection.insert([input], function (err, result) {
if (err) {
// Error 6
cb(err);
} else {
console.log('Inserted '+ result.result.ok+ ' documents into collection. The documents inserted with "_id" are:' + JSON.stringify(result.ops));
cb(null);
}
db.close();
});
}
});
};
module.exports=saveToMongo;
这是控制台输出
Server runing at 8081
POST to /ssd/add
// This is coming from inserttomongo.js
Error 5: Unable to connect to the mongoDB server. Error: { [MongoError: connect ECONNREFUSED 127.0.0.1:27018]
name: 'MongoError',
message: 'connect ECONNREFUSED 127.0.0.1:27018' }
// This is coming from server.js
Error 2: MongoError: connect ECONNREFUSED 127.0.0.1:27018
答案 0 :(得分:0)
好的,弄明白了这个问题。我不得不从之前的地方删除这些行,并将其置于“错误2”注释的其他条件中。
// OK 1
response.writeHead(200, "OK", {'Content-Type': 'text/html'});
response.end();
这是因为在 imongo 完成之前,对 imongo 的调用是异步的,并且响应被设置为200。
非常基本的错误:(