如何使用 node.js 发布页面
how to publish a page using node.js
刚开始学习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
添加到日历 object.
之前,响应被发送到浏览器
我有两个相关问题:
1) "wait" 直到回调完成的正确方法是什么。
2) 如何
我是否使用 res
发送 .ics 动态 link
ical.toString()
作为内容。我是否需要为
这个?
编辑:我想对于第 2 个,我必须像这样设置 HTTP headers
//set correct content-type-header
header('Content-type: text/calendar; charset=utf-8');
header('Content-Disposition: inline; filename=calendar.ics');
但是我该如何在使用视图时执行此操作。
只需send
回复,一旦您获得了必要的数据!您不需要直接在路由中 end
或 send
,但也可以在嵌套回调中执行:
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)
。
刚开始学习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
添加到日历 object.
我有两个相关问题:
1) "wait" 直到回调完成的正确方法是什么。
2) 如何
我是否使用 res
发送 .ics 动态 link
ical.toString()
作为内容。我是否需要为
这个?
编辑:我想对于第 2 个,我必须像这样设置 HTTP headers
//set correct content-type-header
header('Content-type: text/calendar; charset=utf-8');
header('Content-Disposition: inline; filename=calendar.ics');
但是我该如何在使用视图时执行此操作。
只需send
回复,一旦您获得了必要的数据!您不需要直接在路由中 end
或 send
,但也可以在嵌套回调中执行:
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)
。