【发布时间】:2017-05-31 07:51:07
【问题描述】:
是否可以在函数上下文中处理 db.model.find() 查询并不使用使用 callbacks 和 promise 和 mongoose 库检索结果?
我需要确定的是,如果在运行控制器的过程中存在某个用户,那么由于大量相同的操作(例如,与数据库的通信),我无法将当前范围最小化为回调。此外,我正在尝试在我的项目中实现 MVC 模型,因此,我想将帮助程序库(模块)保存在单独的文件中。这就是为什么我不想使用任何回调或承诺——它们会使一切变得更加复杂,甚至比已经发生的事情还要复杂。
例如,我应该如何重写以下代码才能成功执行(如果实际上可能的话)(您可以忽略登录模型和控制器 - 如果使用回调重写该代码,它们被写入表示复杂性) :
user.js 库
var db = require('./lib/db');
class User{
constructor(id){ //get user by id
var result = db.models.user.findOne({_id: id}); //unsupported syntax in real :(
if(!result || result._id != _id)
return false;
else{
this.userInfo = result;
return result;
}
}
}
module.exports = User;
登录模式
var user = require('./lib/user')
var model = {};
model.checkUserLogged(function(req){
if(!req.user.id || req.user.id == undefined)
return false;
if(!(this.user = new user(req.user.id)))
return false;
else
return true;
});
module.exports = model;
登录控制器
var proxy = require('express').router();
proxy.all('/login', function(req, res){
var model = require('./models/login');
if(!model.checkUserLogged()){
console.log('User is not logged in!');
res.render('unlogged', model);
}else{
console.log('User exists in database!');
res.render('logged_in', model);
}
});
生成器函数/yields、async/await (es2017) 以及其他一切都可以用来解决问题而无需嵌套。
提前致谢。
【问题讨论】:
-
仅供参考,
async/await不是 ES7 (ES2016) 的一部分。它将成为今年发布的 ES2017 的一部分。 -
糟糕。感谢您的注意:) 我已经在问题文本中更正了它。
标签: node.js mongodb asynchronous mongoose ecmascript-2016