我正在将 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/