Node.js,Express,Jade-错误:Can';t在发送邮件后设置邮件头
我在尝试使用Jade生成HTML页面时遇到以下错误。还有其他人经历过这个问题吗。我在下面指出了错误的确切原因 错误Node.js,Express,Jade-错误:Can';t在发送邮件后设置邮件头,node.js,express,pug,Node.js,Express,Pug,我在尝试使用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_mod
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/');
var http=require('http'),
express=require('express'),
jade=需要(“jade”),
url=require('url'),
jsdom=require('jsdom'),
子进程=需要(“子进程”),
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”]
HTMLSUB=“”,
querystring=require(“querystring”),
fs=要求(“fs”),
强大=需要(“强大”),
path=require('path'),
请求=要求('请求')
svgsrc=“”;
//创建应用服务器
var app=require('express')。createServer();
//设置视图(模板)目录的路径
app.set('views','u dirname+'/views');
//设置静态文件的路径
app.use(express.static(_dirname+'/../public');
//处理上的GET请求/
app.get('/',函数(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']);
原木(“宽度:”,w);
控制台日志(“高度:”,h);
请求(“http://dcaps-staging.media.mit.edu:8080/api/reality_analysis_service/get_reality_analysis_data?document_key=radialData&bearer_token=8e2f9e3129,函数(错误、结果、json){
json=json.parse(json);
log(“我的径向数据:”,json.radialData.data);
env({features:{QuerySelector:true},html:htmlsub,scripts:scripts,done:function(错误,窗口){
svgsrc=window.insertRadial(#RadialScriptMobileServ),w,h,json.innerHTML;
控制台日志(svgsrc);
res.render('/Users/dereklo/Node/pie/Jade_radial.Jade',{pageTitle:'Franz Enzenhofer'});//此处发生错误!
//res.write(svgsrc);
res.end();
}})
})
});
//在localhost:3000上侦听
app.listen(3000);
//console.log('Pie SVG服务器在运行http://127.0.0.1:3000/');
你可以用两种方法来做。在应用程序上方添加另一条路由。获取(/…)如下:
// global controller
app.get('/*',function(req,res,next){
res.header('Content-Type': 'text/plain' , 0 );
next(); // http://expressjs.com/guide.html#passing-route control
});
或者,您可以将中间件功能添加到现有路由中
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.writeHead(200, {'Content-Type': 'text/plain'});
现在它工作得很好。我希望这将帮助其他偶然发现这篇文章的人…当使用res.render()时,您不需要手动处理响应(res.end()、res.writeHead()等)