404错误时未设置响应| Node.JS& MongoDB的

时间:2015-12-29 07:08:57

标签: node.js mongodb

我正在编写一个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

1 个答案:

答案 0 :(得分:0)

好的,弄明白了这个问题。我不得不从之前的地方删除这些行,并将其置于“错误2”注释的其他条件中。

  // OK 1
  response.writeHead(200, "OK", {'Content-Type': 'text/html'});
  response.end();

这是因为在 imongo 完成之前,对 imongo 的调用是异步的,并且响应被设置为200。

非常基本的错误:(