我正在创建基本的NodeJS / Express?MongoDb应用。我有api模块(控制器),基本上检查路径并告诉模型做事:
api.js
var users = require("../models/user");
module.exports = function(app, u) {
app.get('/api/v1/users/get-all', function(req, res, next) {
res.json({
users: users.getAll()
});
});
};
用户是另一个代表模型的模块。从api模块调用getAll方法并从MongoDb中读取数据:
users.js
Users = function() {
Users.prototype.getAll = function(req, res, next) {
var cursor = this.db.users.find();
// return all the users as json
cursor.toArray(function(err, items) {
return items;
});
}
Users.prototype.setDb = function(db) {
this.db = db;
}
};
module.exports = new Users();
我只是意识到MongoDB this.db.users.find()调用是异步的,所以当getAll从users模块返回时,我的带有res.json(..)的API模块得到了空的结果。
现在,我认为一个选项是通过res。从api模块到用户的对象,当数据准备就绪时,用户会将数据回复给客户端:
api.js
var users = require("../models/user");
module.exports = function(app, u) {
app.get('/api/v1/users/get-all', function(req, res, next) {
users.getAll(res)
});
};
users.js
Users = function() {
Users.prototype.getAll = function(res) {
console.log("aaaaaaaaaaaaaaaa " + this.db);
var cursor = this.db.users.find();
// return all the users as json
cursor.toArray(function(err, items) {
res.json({
users: items
});
});
}
Users.prototype.setDb = function(db) {
this.db = db;
}
};
module.exports = new Users();
这似乎有效但是如果我理解正确的模型不应该做任何事情这样的工作,将东西返回给客户等。
然后我考虑过使用promises,这就是我想出的:
api.js
var users = require("../models/user");
module.exports = function(app, u) {
app.get('/api/v1/users/get-all', function(req, res, next) {
users.getAll().then(function(res) {
console.log("u=users " + (res));
res.json({
users: res
});
});
});
};
users.js
var Q = require("q");
Users = function() {
Users.prototype.getAll = function(req, res, next) {
console.log("aaaaaaaaaaaaaaaa " + this.db);
var cursor = this.db.users.find();
// return all the users as json
return new Q.Promise(function(resolve, reject) {
cursor.toArray(function(err, items) {
resolve(items);
});
});
}
Users.prototype.setDb = function(db) {
this.db = db;
}
};
module.exports = new Users();
我喜欢承诺的简单性,并且想知道我的实现中是否存在任何明显的缺陷,这些缺陷是关于模块如何相互影响而不是细节。