node.js - 从 javascript 回调获取数据的正确方法

标签 node.js express

我正在将 API 服务器从普通的 Nodejs 脚本转换为使用 Express 框架的服务器,以获得更好的稳定性。

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

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 脚本负责渲染最终 View ,但我不希望它们像这样捆绑在一起。

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
                    };
                    // ... ?
                });
            });
        });
    });
}

如何正确获取数据并将其传递给渲染系统?

最佳答案

JavaScript 是一种非常灵活的语言。您实际上并不需要直接将 View 与数据库代码联系起来,因为您可以使用函数作为包装器来抽象 View 代码并将其与数据库逻辑分开。

当需要异步逻辑时,回调可以是一个非常强大的工具。我不确定这里是否需要,但您仍然可以使用包装函数封装 View 逻辑,将 View 代码与数据库代码分开:

View 代码的函数包装:

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


                });
            });

现在,如果您的 View 代码需要更改,您无需触及数据库代码中的任何逻辑或回调函数中的任何逻辑。祝你好运!

关于node.js - 从 javascript 回调获取数据的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10747175/

相关文章:

javascript - 如何在 Cloud Functions for Firebase 上使用 express 执行 HTTP 文件上传(multer,busboy)

android - ionic 通知/推送消息

javascript - sql.execute 不是 Node js 和 sql server 中的函数?

node.js - hogan.js 如何调试变量

node.js - 从 Node (Express) 处理 MongoDB 连接问题

jquery - 将数据从node.js附加到现有的html

node.js - 使用 neo4j JS 驱动程序的套接字挂断

javascript - NodeJS 模块、Chalk 的链接语法是如何工作的?

node.js - 如何针对 firebase 验证身份验证 token ?

javascript - 在用从 mongodb 获得的值填充数组后,将数组作为 JSON 响应发送