gpt4 book ai didi

node.js - NodeJS/Express/Mongoose 发送后报错Can't set headers

转载 作者:可可西里 更新时间:2023-11-01 10:30:27 25 4
gpt4 key购买 nike

我正在使用 MEAN 堆栈和 Mongoose 来查询 MongoDB 上的数据。第一次调用/api/Validations 没问题,但第二次,它总是会收到此错误: enter image description here

这是我的代码,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)

Mongoose 数据库

(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)

验证架构.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;

我在堆栈溢出时阅读了所有“发送后无法设置 header ”,并尝试应用一些方法但没有成功。请帮助我。

更新 1:

我认为这是 Mongoose 问题,因为在我将其更改为使用 MongoDB 后,它工作正常: (函数(数据库){ var MongoClient = require('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/Validations,但这个问题仍然存在,因为这个项目需要 Mongoose。

最佳答案

取而代之的是:

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

}

关于node.js - NodeJS/Express/Mongoose 发送后报错Can't set headers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26604619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com