如何在node.js中正确实现读取stream的callback逻辑?

我正在尝试在node.js中实现小型的RSS阅读器(将呈现feed数据作为html页面)。

我到目前为止已经到了这个地步:

var FeedParser = require(__dirname + '/../node_modules/feedparser') , request = require(__dirname + '/../node_modules/request'); exports.news = function(req, res){ var news = []; request('http://feeds.feedburner.com/niebezpiecznik/') .pipe(new FeedParser()) .on('error', function(error) { // ... }) .on('meta', function (meta) { console.log('===== %s =====', meta.title); console.log('**** %s ****', meta.description); console.log(); }) .on('readable', function() { var stream = this, item; var i = 0; while (item = stream.read()) { var this_news = { 'title': item.title, 'description': item.description } news.push(this_news); console.log(i++); } res.render('rss', { title: 'Node.js based RSS reader', newsi: JSON.stringify(news) }); }); }; 

以下玉模板:

扩展布局

 block content h1= title p Welcome to #{title} script(type='text/javascript'). var inews = JSON.parse('!{newsi}'); console.log(inews); ul for news in newsi li= news else li sorry, no newsHERE! 

但我不断收到以下错误:

 0 GET /rss 304 532ms 0 Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (http.js:691:11) at ServerResponse.res.setHeader (/home/XXX/programming/nodejs/node-express-aws/node_modules/express/node_modules/connect/lib/patch.js:63:22) at ServerResponse.res.set.res.header (/home/XXX/programming/nodejs/node-express-aws/node_modules/express/lib/response.js:527:10) at ServerResponse.res.contentType.res.type (/home/XXX/programming/nodejs/node-express-aws/node_modules/express/lib/response.js:396:15) at ServerResponse.res.send (/home/XXX/programming/nodejs/node-express-aws/node_modules/express/lib/response.js:112:14) at fn (/home/XXX/programming/nodejs/node-express-aws/node_modules/express/lib/response.js:794:10) at View.exports.renderFile [as engine] (/home/XXX/programming/nodejs/node-express-aws/node_modules/jade/lib/jade.js:222:12) at View.render (/home/XXX/programming/nodejs/node-express-aws/node_modules/express/lib/view.js:76:8) at Function.app.render (/home/XXX/programming/nodejs/node-express-aws/node_modules/express/lib/application.js:504:10) at ServerResponse.res.render (/home/XXX/programming/nodejs/node-express-aws/node_modules/express/lib/response.js:798:7) 

我应该把这个render部分放在哪里?

readable事件可能被多次触发,即使当你从它的处理程序中调用read ,我想。

我不熟悉Feedparser模块,但尝试使用dataend事件:

 .on('data', function(item) { var this_news = { 'title': item.title, 'description': item.description } news.push(this_news); console.log(i++); }) .on('end', function() { res.render('rss', { title: 'Node.js based RSS reader', newsi: JSON.stringify(news) }); }); 

如果这不起作用,仍然可以使用readable事件处理程序,但是确保从end处理程序调用res.render