Node.js,Express,Jade – 错误:发送后无法设置标题

试图使用Jade生成HTML页面时出现以下错误。 有其他人遇到过这个问题吗? 我在下面注意到错误是由什么引起的。

错误

Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (http.js:644:11) at ServerResponse.res.setHeader (/Users/dereklo/node_modules/express/node_modules/connect/lib/patch.js:59:22) at ServerResponse.res.set.res.header (/Users/dereklo/node_modules/express/lib/response.js:475:10) at ServerResponse.res.contentType.res.type (/Users/dereklo/node_modules/express/lib/response.js:350:15) at ServerResponse.res.send (/Users/dereklo/node_modules/express/lib/response.js:111:14) at res.render.fn (/Users/dereklo/node_modules/express/lib/response.js:672:10) at Object.exports.render (/Users/dereklo/node_modules/jade/lib/jade.js:216:5) 

Node.js / Express / Jade源代码

 var http = require('http'), express = require('express'), jade = require('jade'), url = require('url'), jsdom = require('jsdom'), child_proc = require('child_process'), w, h, scripts = ["/Users/dereklo/Node/pie/d3.min.js", "/Users/dereklo/Node/pie/d3.v2.js", "/Users/dereklo/Node/pie/d3.layout.min.js", "/Users/dereklo/Node/pie/RadialScriptMobileServ.js", "/Users/dereklo/Node/pie/RadialScriptMobile.js", "/Users/dereklo/Node/pie/canvg.js"]; //scripts = ["./d3.v2.js", // "./d3.layout.min.js", // "./pie.js"] htmlStub = '<!DOCTYPE html><div id="RadialScriptMobileServ"></div>', querystring = require("querystring"), fs = require("fs"), formidable = require("formidable"), path = require('path'), request = require('request') svgsrc = ''; //create an app server var app = require('express').createServer(); //set path to the views (template) directory app.set('views', __dirname + '/views'); //set path to static files app.use(express.static(__dirname + '/../public')); //handle GET requests on / app.get('/', function(req, res){ res.writeHead(200, {'Content-Type': 'text/plain'}); w = (url.parse(req.url, true).query['width']); h = (url.parse(req.url, true).query['height']); console.log("width: ",w); console.log("height: ",h); request("http://dcaps-staging.media.mit.edu:8080/api/reality_analysis_service/get_reality_analysis_data?document_key=radialData&bearer_token=8e2f9e3129", function (err, result, json) { json = JSON.parse(json); console.log("my radial data: ",json.radialData.data); jsdom.env({features:{QuerySelector:true}, html:htmlStub, scripts:scripts, done:function(errors, window) { svgsrc = window.insertRadial("#RadialScriptMobileServ",w,h,json).innerHTML; console.log(svgsrc); res.render('/Users/dereklo/Node/pie/Jade_radial.jade', {pageTitle: 'Franz Enzenhofer'}); // ERROR OCCURRING HERE! // res.write(svgsrc); res.end(); }}) }) }); //listen on localhost:3000 app.listen(3000); //console.log('Pie SVG server running at http://127.0.0.1:3000/'); 

我的问题是,我需要删除:

 res.writeHead(200, {'Content-Type': 'text/plain'}); 

它现在完美地工作。 我希望这会帮助其他人绊倒这个职位…

你可以用两种方法做到这一点。 或者在app.get(/ ..)之上添加另一条路线,如下所示:

 // global controller app.get('/*',function(req,res,next){ res.header('Content-Type': 'text/plain' , 0 ); next(); // http://expressjs.com/guide.html#passing-route control }); 

或者您可以将中间件function添加到您现有的路线

 addToHeader = function (req, res, next) { console.log("add to header called ... " + req.url); res.header('Content-Type': 'text/plain', '0'); next(); } and then change your routes to sth like this: app.get('/', addToHeader, function(req,res){ var stuff = { 'title': 'blah' }; res.render('mytemplate',stuff); }); 

当使用res.render()时,您不需要手动处理响应(res.end(),res.writeHead()等)。