如何使用node.js发布页面

我刚开始学习node.js。 在过去的两天里,我一直在研究一个接受用户input并发布ICS文件的项目。 我所有的工作。 现在考虑何时需要显示这些数据。 我得到一个router.get来看看我是否在/cal页面和..

 router.get('/cal', function(req, res, next) { var db = req.db; var ical = new icalendar.iCalendar(); db.find({ evauthor: 'mykey' }, function(err, docs) { docs.forEach(function(obj) { var event2 = ical.addComponent('VEVENT'); event2.setSummary(obj.evics.evtitle); event2.setDate(new Date(obj.evics.evdatestart), new Date(obj.evics.evdateend)); event2.setLocation(obj.evics.evlocation) //console.log(ical.toString()); }); }); res.send(ical.toString()); // res.render('index', { // title: 'Cal View' // }) }) 

所以当/cal被请求的时候,它循环遍历我的db并创build一个ICS日历。 如果我在循环内做了console.log(ical.toString) 它给了我一个遵循协议的格式正确的日历。

不过,我想用这个结束响应。 最后我做了一个res.send来查看页面上发布的内容。 这是发表

 BEGIN:VCALENDAR VERSION:2.0 PRODID:calendar//EN END:VCALENDAR 

现在原因很明显 。 它的node.js的本质 在callback函数完成将每个单独的VEVENT添加到日历对象之前,响应会被发送到浏览器。

我有两个相关的问题:

1)什么是正确的方式来“等待”,直到callback完成。

2)我如何使用res发送一个.icsdynamic链接作为内容的ical.toString() 。 我是否需要为此创build一个新的视图?

编辑:我想数字2我必须像这样设置HTTP头

 //set correct content-type-header header('Content-type: text/calendar; charset=utf-8'); header('Content-Disposition: inline; filename=calendar.ics'); 

但是如何在使用视图时执行此操作。

一旦您获得了必要的数据,只需send回复! 你不需要直接endsend你的路由,但也可以在嵌套的callback中完成:

 router.get('/cal', function(req, res, next) { var db = req.db; var ical = new icalendar.iCalendar(); db.find({ evauthor: 'mykey' }, function(err, docs) { docs.forEach(function(obj) { var event2 = ical.addComponent('VEVENT'); event2.setSummary(obj.evics.evtitle); event2.setDate(new Date(obj.evics.evdatestart), new Date(obj.evics.evdateend)); event2.setLocation(obj.evics.evlocation) }); res.type('ics'); res.send(ical.toString()); }); }); 

我还包括使用res.type发送适当的Content-Type

另外:不要忘记添加适当的error handling。 例如,如果检索文档时发生错误,可以使用res.sendStatus(500)