【发布时间】:2016-05-17 13:53:33
【问题描述】:
用例
使用 Node.js、Express 和 Handlebars 等模板引擎查询 Wordpress 和 CouchDB 等其他 API 并呈现结果。
我已经走了这么远
var https = require('https');
var express = require('express');
var handlebars = require('express-handlebars')
.create({ defaultLayout:'main' });
var app = express();
app.engine('handlebars', handlebars.engine);
app.set('view engine', 'handlebars');
app.set('port', process.env.PORT || 3000);
app.set('ip', process.env.IP);
var options = {
hostname: 'public-api.wordpress.com',
path: '/rest/v1.1/sites/somesite.wordpress.com/posts/16',
method: 'GET'
};
app.get('/test', function(req, res) {
https.request(options, function(restRes) {
console.log('STATUS: ' + restRes.statusCode);
res.render('home', { "title": "Test" }); // This code works.
restRes.on('data', function (jsonResult) {
// res.render('home', { "title": "Test" }); This code (after removing the line above) does not work.
console.log('BODY: ' + jsonResult);
});
}).end();
});
app.listen(app.get('port'), app.get('ip'), function(){
console.log( 'Express started on http://' + app.get('ip') + ": " +
app.get('port') + '; press Ctrl-C to terminate.' );
});
此代码有效,并且 jsonResult 在控制台上显示正确。在restRes.on('data', function (jsonResult) 回调中移动res.render('home', { "title": "Test" }); 行会引发错误。
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:331:11)
at ServerResponse.header (/home/ubuntu/workspace/node_modules/express/lib/response.js:718:10)
at ServerResponse.send (/home/ubuntu/workspace/node_modules/express/lib/response.js:163:12)
at res.render.done (/home/ubuntu/workspace/node_modules/express/lib/response.js:957:10)
at Immediate._onImmediate (/home/ubuntu/workspace/node_modules/express-handlebars/lib/utils.js:26:13)
at processImmediate [as _immediateCallback] (timers.js:374:17)
我是否监督一个明显的错误?如何以正确的方式做到这一点?
【问题讨论】:
标签: javascript node.js rest express