2

我正在使用 express 框架将一个 api 服务器从一个普通的 nodejs 脚本转换为一个,以获得更好的稳定性。

我的问题之一是您无法从回调中返回值,因为原始代码仍在继续......

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.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 回答