Node.js 从javascript回调获取数据的正确方法
我正在将一个api服务器从一个普通的nodejs脚本转换为一个使用express框架的脚本,以获得更好的稳定性 我的问题之一是,您无法从回调返回值,因为原始代码已继续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.
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-你不是哑巴,只是想得太多了!这发生在我们当中最好的人身上;)祝你好运