gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:18:57 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com