NodeJS / Express / Mongoose get error发送后无法设置标题

我正在使用Mongoose的MEAN堆栈来查询MongoDB上的数据。 首先调用/ api /validation是好的,但第二次,它总是得到这个错误: 在这里输入图像描述

在这里我的代码,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:

我认为这是Mongoose的问题,因为我改变它使用MongoDB,它工作正常:(函数(数据库){var MongoClient =要求('mongodb')。

  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 / Validations,因为这个问题还是存在的,因为这个项目需要Mongoose。

       

网上收集的解决方案 "NodeJS / Express / Mongoose get error发送后无法设置标题"

而不是这个:

 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)); } }