我遇到以下错误:
Error: Can't set headers after they are sent.
at validateHeader (_http_outgoing.js:491:11)
at ServerResponse.setHeader (_http_outgoing.js:498:3)
at Array.write (D:\UberGo\node_modules\finalhandler\index.js:285:9)
at listener (D:\UberGo\node_modules\on-finished\index.js:169:15)
at onFinish (D:\UberGo\node_modules\on-finished\index.js:100:5)
at callback (D:\UberGo\node_modules\ee-first\index.js:55:10)
at IncomingMessage.onevent (D:\UberGo\node_modules\ee-first\index.js:93:5)
at emitNone (events.js:106:13)
at IncomingMessage.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1064:12)
at _combinedTickCallback (internal/process/next_tick.js:139:11)
at process._tickCallback (internal/process/next_tick.js:181:9)
我的控制器:
app.get('/rider/history', function(request, response,next) {
rideHistory=[];
rhController.getAllRides(request.session.riderId, function (err, result) {
if (err) return handleError(err);
if (result.length > 0) {
response.render('rider_history.html',{
rideHistory: JSON.stringify(result),
Title: config.title.history,
moment: moment
});
response.end();
}
});
var Projection = {
__v : false,
_id : false,
};
exports.getAllRides = function(riderId, callback){
rideHistory.find({RiderId: riderId},Projection, callback);
};
在渲染页面时,它可以正常工作,但是在调用JSON.stringify()
之后,出现了以上错误。我不知道该如何解决,或者我做错了什么?
我想在Google Maps中显示骑士数据,并且返回的数据未格式化。-这就是我必须使用JSON.stringify(stringify)的原因。
答案 0 :(得分:3)
请勿同时使用render和end方法。如果您使用响应方法两次或更多次,则会发生错误:发送标头后无法设置标头
您不需要在express中使用response.end方法。删除它,然后您的代码即可使用。
渲染方法已经包含最终功能。
答案 1 :(得分:1)
根据express的render方法实现
res.render = function render(view, options, callback) {
var app = this.req.app;
var done = callback;
var opts = options || {};
var req = this.req;
var self = this;
// support callback function as second arg
if (typeof options === 'function') {
done = options;
opts = {};
}
// merge res.locals
opts._locals = self.locals;
// default callback to respond
done = done || function (err, str) {
if (err) return req.next(err);
self.send(str); // < - THIS LINE IS SENDING RESPONSE
};
// render
app.render(view, opts, done);
};
默认情况下,它正在发送响应,因此您只能向一个HTTP请求发送一个响应,因此,在表达方式上,每个请求只能跟踪一次,因此只能使用一种方法。
您无法在一个函数中结合使用任何一种方法,因此在代码中删除response.end()
将解决您的问题。