NodeJS/Express/Mongoose获取错误发送后无法设置标题

问题描述:

我正在使用MEAN堆栈和Mongoose在MongoDB上查询数据。第一个电话到/ API /验证是好的,但在第二次,它总是得到这样的错误: enter image description hereNodeJS/Express/Mongoose获取错误发送后无法设置标题

这里我的代码,server.js:

var express = require('express') 
    , app = express() 
    , bodyParser = require('body-parser') 
    , breezeRoutes = require('./breeze-routes') 
    , controller = require('./controller') 
    , compress = require('compression') 
    , cors = require('cors') 
    , errorHandler = require('./errorHandler') 
    , favicon = require('static-favicon') 
    , fileServer = require('serve-static') 
    , http = require('http') 
    , isDev = app.get('env') === 'development' 
    , logger = require('morgan') 
    , port = process.env["PORT"] || 4000; 

app.use(favicon()); 
app.use(logger('dev')); 
app.use(compress()); 
app.use(bodyParser()); // both json & urlencoded 
app.use(cors());   // enable ALL CORS requests 
controller.init(app); // Configure routes for REST API  
app.use(errorHandler); 

// create server (in case interested in socket.io) 
var server = http.createServer(app); 

// Start listening for HTTP requests 
server.listen(port); // app.listen(port); // if we weren't using 'server' 

console.log('\nListening on port ' + port); 

controller.js:

(function (controller) { 
    var mongooseDB = require("./mongooseDB"); 

    controller.init = configureRoutes; 
    function configureRoutes(app) { 
     app.get('/api/Validations', getValidations);  
    } 

    function getValidations(req, res, next) { 
     mongooseDB.getValidations(makeResponseHandler(res, next)); 
    } 

    function makeResponseHandler(res, next) { 
     // returns a function that handles response from a Breeze Mongo query or save 
     return function (err, results) { 
      if (err) { 
       next(err); 
      } else { 
       // Prevent browser from caching results of API data requests 
       //res.setHeader('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0'); 
       //res.setHeader("Content-Type:", "application/json"); 
       res.send(JSON.stringify(results)); 
       res.end(); 
      } 

     } 
    } 
})(module.exports) 

mongooseDB.js

(function (mongooseDB) { 
    var schema = require("./schema"); 
    var validator = require("./validator"); 
    var mongoUrl = 'mongodb://localhost:27017/dpt'; 
    var mongoose = require('mongoose'); 
    var Validations = mongoose.model('Validations', schema.ValidationSchema); 

    mongooseDB.getValidations = function (next) { 
     mongoose.connect(mongoUrl); 
     mongoose.connection.on('open', function() { 
      var query = Validations.find(); 
      query.exec(function (err, docs) { 
       mongoose.disconnect(); 
       if (err) { 
        next(err, null); 
       } else { 
        next(null, docs); 
       } 
      }); 
     }); 
    }; 
})(module.exports) 

validationSchema.js

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var validationSchema = new Schema({ 
    ValidationID: { type: String, index: 1, required: true, unique: true }, 
    Integer: { type: Number, required: true }, 
    String: String, 
    Date: Date, 
    BeforeDate: Date, 
    AfterDate: Date, 
    Age: Number, 
    CreditCard : Number, 
    Email: String, 
    Phone: String, 
    URL: String, 
    Zip: String, 
    StartsWithDPT: String, 
    ContainsDPT: String 
}, { collection: 'Validations' }); 
exports.ValidationSchema = validationSchema; 

我在堆栈溢出中读取所有“发送后无法设置标题”,并尝试应用某种方法,但没有运气。 请帮帮我。

更新1:

我认为这是猫鼬的问题,因为之后我改变了它使用MongoDB的,它工作正常: (函数(数据库){ VAR MongoClient =需要( 'mongodb的')。 MongoClient;

 database.getDb = getDb; 
     database.getValidations = getValidations; 

     var db = null; 
     // todo: get from configuration 
     var mongoUrl = 'mongodb://localhost:27017/dpt'; 
     var mongoOptions = { 
      server: { auto_reconnect: true } 
     }; 

     function getDb(next) { 
      if (db) { 
       next(null, db); 
      } else { 
       MongoClient.connect(mongoUrl, mongoOptions, function (err, theDb) { 
        if (err) { 
         err.message = (err.message || '') + '. Is the MongoDb server running?'; 
         next(err, null); 
        } else { 
         db = theDb; 
         next(null, db); 
        } 
       }); 
      } 
     } 

     function getValidations(next) { 
      getDb(function (err, data) { 
       if (err) { 
        err.message = (err.message || '') + '. Is the MongoDb server running?'; 
        next(err, null); 
       } else { 
        data.collection("Validations").find().toArray(function (err1, results) { 
         next(null, results); 
        });; 

       } 
      }); 
     }  
})(module.exports) 

现在我可以调用/ API /验证多次,我想这个问题还是存在的,因为这个项目需要的猫鼬

项。这TEAD:

return function (err, results) { 
      if (err) { 
       next(err); 
      } else { 
       // Prevent browser from caching results of API data requests 
       //res.setHeader('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0'); 
       //res.setHeader("Content-Type:", "application/json"); 
       res.send(JSON.stringify(results)); 
      } 
      res.end(); 
     } 

使用此

return function (err, results) { 
      if (err) { 
       next(err); 
      } else { 
       // Prevent browser from caching results of API data requests 
       //res.setHeader('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0'); 
       //res.setHeader("Content-Type:", "application/json"); 
       res.end(JSON.stringify(results));      
      } 

    } 
+0

感谢@Suburaj但实际上,这是我第一次的做法,并没有工作。我仍然遇到这个问题。 我更新了我的问题 – 2014-10-28 09:23:56

+0

@Quoc Nguyen代码现在正在工作???如果这有用,请不要忘记接受答案。 – Subburaj 2014-10-28 09:25:43

+1

'res.send'调用'res.end'无论如何。 – 2014-10-28 09:34:37