我正在尝试在 Node.js 中编写一个 RESTful API,它基本上围绕控制器/模型模式,并且我遇到了一些关于 Node.js 异步性质的问题:
Station.js:(控制器)
'use strict';
var url = require('url');
var Stations = require('./StationsService');
module.exports.stationsGet = function stationsGet(req, res, next){
var result = Stations.stationsGet(req.swagger.params['arg']);
if(typeof result !== 'undefined') {
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify(result || {}, null, 2));
}
else
res.end();
};
StationService.js:(模型)
'use strict';
exports.stationsGet = function(param){
var data_output = {};
var sql = 'SELECT * FROM foo WHERE args = ${foo}';
db.execute(sql, {foo: param}, db.queryResult.any, function(result){
// 'result' containing the query data
});
// Ideally: data_output = result;
return data_output;
}
问题是,如果我在 db.execute 上使用回调来继续,我必须提供所有控制器上下文(res,...)来回复客户端,并且它会破坏模型/控制器架构,因为我的模型执行剩余的控制器工作。
有没有一种(简单?)方法来获取 stationGet() 中的查询结果然后返回它?
这真的违反了nodejs的本质吗?如果是的话,在这种情况下如何采取正确的行为?
PS:我使用的是 swagger,它为 Node.js 生成了文件和基本结构。