同步mongoose请求

是否有可能在函数上下文中处理db.model.find()查询,并检索结果, 而不使用callback和承诺与mongoose库?

我需要保证,如果有一些用户存在于运行控制器的过程中,那么由于大量的相同操作(例如与数据库的通信),我不能将当前范围最小化为​​callback。 另外我想在我的项目中实现MVC模型,所以,我想保持在分离的文件的帮助器库(模块)。 这就是为什么我不想使用任何callback或承诺 – 他们将使事情复杂化,甚至更多的事情已经完成。


例如,我应该如何重写下面的代码才能成功执行(如果实际上是可行的话)(您可以忽略login模型和控制器 – 如果使用callback重写代码,它们被写成表示复杂性):

user.js lib

 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; 

login模式

 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; 

login控制器

 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); } }); 

发电机function/产量,asynchronous/等待( es2017 )以及其他一切等都可以用来解决问题,而不需要嵌套。

Thx提前。

有两点错误:

  • Mongoose方法不能同步调用(不pipe怎样,同步调用数据库并不是一个好主意)。
  • 在ES6类的构造函数中也不能使用asynchronous/等待或生成器。 这是在这个答案解释。

如果你不想嵌套的代码,一个简单的select可以使用asynchronous/等待(目前在Node.js中使用一个标志,不推荐用于生产)。 由于Mongoose方法返回promise,所以可以与async / await一起使用。

但正如我所说,你不能在构造函数中这样做,所以它必须在别的地方。

作为一个例子,你可以做这样的事情:

 var proxy = require('express').router(); var db = require('./lib/db'); proxy.all('/login', async function(req, res){ const result = await db.models.user.findOne({_id: req.user.id}).exec(); if (!result) { console.log('User is not logged in!'); return res.render('unlogged'); } res.render('logged_in'); });