1

node.js を使用して大規模なプロジェクトを開始したばかりで、コールバックの悪夢の問題に遭遇しました。以前にいくつかの node.js 開発を行ったことがありますが、チュートリアルに基づいた小さなものだけです。

私はユーザーモデルとそのユーザーの所有者である所有者モデルを持っています...基本的に、node.jsで構築している部分はRESTサービスになるため、ユーザーとその所有者名を含むjsonを送信する必要があります。私の問題は、ルビーやphpで行うように所有者名を取得しようとしていて、それをプロパティとして設定しようとしています..しかし、うまくいきません。

コールバック関数でオブジェクトを変更する必要がある node.js で、この種のロジックをどのように処理するのでしょうか? また、パフォーマンスに影響を与えたくありません。

これは要件だったので、データベースとして mysql を使用しています。したがって、コードは次のとおりです。

//find all 
req.models.users.find({
    'id' : req.query.id
}, function(err, users) {
    if (err) console.log(err); //do something better here
    else {
        var json = [];
        users.forEach(function(user) {
            user.getOwner(function(err, owner) {
                user.accountOwner = owner.name;

                json.push(user;
            });    
        });

        res.type('application/json');
        res.send(json);
    }
});

次のようなものを送信したい: [{ 'id': user.id, 'username": user.username, 'email': user.email, 'owner': user.owner.name' }, {... }]

4

1 に答える 1

2

問題は、ノード コードの制御フローを理解していないことです。時系列で上から下に行ごとに移動するわけではありません。したがって、問題は、コールバックが実行res.send(json)される前に(時間内に)発生user.getOwnerすることです。そのため、空のjsonを送信し、すでに送信された後にjson配列に物を詰め込みます。async.each結合を行い、すべてのユーザーの所有者が入力されるのを待ってから、応答を送信するようなものを使用する必要があります。または、データベースに対して N+1 クエリを実行する代わりに、SQL 結合を記述して、実際にデータベースにデータを結合させることもできます。

于 2013-07-25T08:10:33.720 に答える