2

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 を作成しますicalconsole.log(ical.toString) ループ内で行うと、プロトコルに従って適切にフォーマットされたカレンダーが表示されます。

しかし、これで応答を終了したいと思います。最後にres.send、ページに何が公開されるかを確認するだけです。公開されるのはこれ

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

その理由は明らかです。それはnode.jsの性質です。VEVENTコールバック関数がカレンダー オブジェクトへの各個人の追加を完了する前に、応答がブラウザーに送信されます。

関連する質問が 2 つあります。

1)コールバックが完了するまで「待機」する適切な方法は何ですか。

res2) コンテンツとして.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');

しかし、ビューを使用するときにこれを行うにはどうすればよいですか。

4

1 に答える 1

0

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());
    });
});

Content-Typeを使用して適切な送信も含めましたres.type

また、適切なエラー処理を追加することを忘れないでください。res.sendStatus(500)たとえば、ドキュメントの取得中にエラーが発生した場合に使用できます。

于 2015-02-08T23:44:14.277 に答える