0

mongoose を使用して mongodb に接続する node.js アプリがあります。挿入されたすべてのドキュメントを選択する必要があり、非同期のものに問題があります。

次の機能を持つモデルを作成しました。

exports.listItems=function() {
    Ticket.find({}, function(err,tkts) {
            console.log(tkts);
            return tkts;
    });
}

「tkts」の値は正しく表示されますが、次から呼び出すと:

exports.list = function(req,res) {
    var items=db.listItems();
    console.log("Items:"+items);
    res.render('list', { title: title, items:items });
}

app.js で次のように定義されています。

app.get('/list', routes.list);

items は未定義です(db.list()の非非同期定義のためだと思います)。

私は何を間違っていますか?どうすれば修正できますか?

4

1 に答える 1

1

コールバックをより適切に使用する必要があります。

より伝統的なlistItems機能は

exports.listItems = function(done) {
    Ticket.find({}, done);
}

次に、 でlist次のことができます。

exports.list = function(req,res) {
    db.listItems(function(err,items){
        console.log("Items:"+items);
        res.render('list', { title: title, items:items });
    });
}

Node.JS の非同期性のため、関数では常にコールバックを渡す (そして期待する) 必要があります。何か非同期が実行された場合に実行を延期できるようにします。

また、 asyncをチェックしてください。これは非常に優れた使いやすいライブラリであり、複雑な非同期シナリオを簡単に簡素化できます。

于 2013-01-25T15:50:39.847 に答える