我试图将一个对象从控制器传递给视图。因为我希望我的模型将我的查询从控制器中分离出来,所以我加载了一个JS对象(模型)。
我的模型如下:
function MyDatabase(req) {
this._request = req;
this._connection = null;
this.init();
};
MyDatabase.prototype = {
init: function() {
this._request.getConnection( function(err, con) {
if(err) return false;
return this._connection = con;
}.bind(this));
},
getFromTable: function(table) {
this._connection.query('SELECT * FROM '+ table +';', function(err, result) {
if(err)
return false;
else if( !result )
return {error: 'Error bij het ophalen van foto\'s'};
else
return result;
}.bind(this));
}
};
module.exports = MyDatabase;
但我无法弄清楚如何在我的控制器中完成此查询。我找到了async模块并尝试了多个函数,如瀑布和并行,但它们都没有为我工作(或者我没有按原样使用它)。
我的控制器目前看起来如下所示:
var myDatabase = require('../dbmodel');
router.get('/', function(req, res, next) {
var db = new myDatabase(req);
async.waterfall([
function(callback) {
var db = new myDatabase(req);
var photos = db.getFromTable('photos');
callback(null, photos);
}
], function(p) {
res.locals.photos = p;
res.render('photos');
} );
});
我做错了什么?我知道NodeJS工作异步并且不等待任何功能完成。但必须有一种方法可行。我做错了什么,或者我误解了什么?
先谢谢了! ;)
答案 0 :(得分:2)
getFromTable
方法应接受将处理其执行结果的回调。
// Accept a callback as a parameter
getFromTable: function(table, callback) {
this._connection.query('SELECT * FROM '+ table +';', function(err, result) {
if(err)
// execute the callback for a null result and an error.
callback(err, null);
else if( !result )
callback(new Error('Error bij het ophalen van foto\'s'),null);
else
// execute the callback on the result
callback(null, result);
}.bind(this));
}
现在可以这种方式使用该方法:
// This is the callback to be passed into the method.
function processResult(err, result) {
console.log(result);
}
db.getFromTable('photos', processResult);