Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从javascript回调获取数据的正确方法_Node.js_Express - Fatal编程技术网

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

Node.js 从javascript回调获取数据的正确方法,node.js,express,Node.js,Express,我正在将一个api服务器从一个普通的nodejs脚本转换为一个使用express框架的脚本,以获得更好的稳定性 我的问题之一是,您无法从回调返回值,因为原始代码已继续 var _json = api.query(); 不知何故,我们希望.query()返回最终结果对象,这样我们就可以将其字符串化为JSON,然后将其传递给渲染引擎,如下所示: // Render the display res.render('posts-resp', { title: res.app.settings.

我正在将一个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查询使用回调来处理查询结果,因此不可能返回这样的值。在原始版本中,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
                    };
                    // ... ?
                });
            });
        });
    });
}

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

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代码:

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代码中的任何逻辑或回调函数中的任何逻辑。祝你好运

问题的一部分在于,这需要将呈现代码与expressjs路由函数分离,因此所有这些变量都必须通过db函数传递,或者至少存储在可以从正确作用域访问的变量中。将渲染代码分离到其函数中的想法是正确的,但在这种情况下,我不知道为什么我从未想过将其作为回调本身传递。这样我就避免了所有的作用域问题,db代码将render函数作为回调调用。@botsknet-你不是哑巴,只是想得太多了!这发生在我们当中最好的人身上;)祝你好运