2

安定性を大幅に向上させるために、APIサーバーをプレーンなnodejsスクリプトからエクスプレスフレームワークを使用するスクリプトに変換しています。

私の問題の 1 つは、元のコードが続いているため、コールバックから値を返すことができないという事実です...

var _json = api.query();

どういうわけか、.query() が最終的な結果オブジェクトを返すことを好むので、それを JSON に文字列化してから、次のようにレンダリング エンジンに渡すことができます。

// Render the display
res.render('posts-resp', {
    title: res.app.settings.app_title,
    _use_Callback: _use_Callback,
    json: _json
});

ただし、db クエリはコールバックを使用してクエリ結果を処理するため、このような値を返すことはできません。元のバージョンでは、db スクリプトが最終ビューのレンダリングを処理していましたが、そのように結び付けたくありません。

query: function(){

    db.query( this._buildQuery(), function(err, res){
        if(err){ throw err; }
        res.fetchAll(function(err, rows){
            if(err){ throw err; }
            db.query('SELECT FOUND_ROWS() as num, UNIX_TIMESTAMP() as query_timestamp;', function(err, cnt_res){
                if(err){ throw err; }
                cnt_res.fetchAll(function(err, cnt_rows){
                    var obj = {
                        results:rows,
                        total_results:cnt_rows[0].num,
                        current_offset:self.offset,
                        query_timestamp:cnt_rows[0].query_timestamp
                    };
                    // ... ?
                });
            });
        });
    });
}

データを適切に取得してレンダリング システムに渡すにはどうすればよいですか?

4

1 に答える 1

1

JavaScript は非常に柔軟な言語です。関数をラッパーとして使用してビューコードを抽象化し、DB ロジックから分離しておくことができるため、実際にはビューを DB コードに直接結び付ける必要はありません。

非同期ロジックが必要な場合、コールバックは非常に強力なツールとなります。ここで必要かどうかはわかりませんが、ビュー ロジックをカプセル化するラッパー関数を使用して、ビュー コードを DB コードから分離しておくことができます。

ビュー コードの関数ラッパー:

function delegateToView(data) {

    // process data here before sending to view

    // Render the display
    res.render('posts-resp', {
        title: res.app.settings.app_title,
        _use_Callback: _use_Callback,
        json: _json
    });
}

コールバックでの関数呼び出しを含む DB コード:

 db.query('SELECT FOUND_ROWS() as num, UNIX_TIMESTAMP() as query_timestamp;', function(err, cnt_res){
                if(err){ throw err; }
                cnt_res.fetchAll(function(err, cnt_rows){
                    var obj = {
                        results:rows,
                        total_results:cnt_rows[0].num,
                        current_offset:self.offset,
                        query_timestamp:cnt_rows[0].query_timestamp
                    };
                    // ... ?

                    //call your delegator here and pass in any needed data.
                     // this keeps the actual view code separate.
                    delegateToView(obj);


                });
            });

これで、ビュー コードを変更する必要が生じた場合でも、DB コードのロジックやコールバック関数のロジックに手を加える必要はありません。幸運を!

于 2012-05-25T01:02:57.317 に答える