node.jsの学習を始めたばかりです。この 2 日間、私はユーザー入力を受け入れて 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 calendar を作成しますical
。console.log(ical.toString)
ループ内で行うと、プロトコルに従って適切にフォーマットされたカレンダーが表示されます。
しかし、これで応答を終了したいと思います。最後にres.send
、ページに何が公開されるかを確認するだけです。公開されるのはこれ
BEGIN:VCALENDAR VERSION:2.0
PRODID:calendar//EN
END:VCALENDAR
その理由は明らかです。それはnode.jsの性質です。VEVENT
コールバック関数がカレンダー オブジェクトへの各個人の追加を完了する前に、応答がブラウザーに送信されます。
関連する質問が 2 つあります。
1)コールバックが完了するまで「待機」する適切な方法は何ですか。
res
2) コンテンツとして.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');
しかし、ビューを使用するときにこれを行うにはどうすればよいですか。