如何使用node.js发布页面

时间:2015-02-08 23:26:40

标签: node.js asynchronous express nedb

我刚开始学习node.js.在过去的两天里,我一直致力于一个接受用户输入并发布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时,它会遍历我的数据库并创建一个ICS日历ical。如果我在循环中console.log(ical.toString) ,它会根据协议为我提供格式正确的日历。

但是,我想以此结束回复。最后我做了res.send只是为了看看在页面上发布了什么。这是发表的内容

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

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

我有两个相关的问题:

1)正确的方式是等待"直到回调完成。

2)如何     使用res发送.ics动态链接     ical.toString()作为内容。我是否需要为其创建新视图     这个?

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

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

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

1 个答案:

答案 0 :(得分:0)

一旦获得必要的数据,只需send回复!您不需要直接在路线中endsend,但也可以在嵌套回调中执行此操作:

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

另外:不要忘记添加正确的错误处理。例如,如果在检索文档时发生错误,您可以使用res.sendStatus(500)