同步猫鼬请求

Synchronous mongoose request

是否可以在函数上下文中处理 db.model.find() 查询并检索结果 而无需 使用 回调和承诺 使用猫鼬库?

我需要放心,如果某些用户存在于 运行 控制器的进程中,那么,由于大量相同的操作(例如,与数据库通信),我无法将当前回调范围最小化).此外,我正在尝试在我的项目中实现 MVC 模型,因此,我想将帮助程序库(模块)保存在单独的文件中。这就是为什么我不想使用任何回调或承诺 - 它们很多时候会使一切复杂化,甚至比已经发生的事情还要复杂。


例如,我应该如何重写以下代码才能成功执行(如果实际上可能的话)(你可以忽略 login 模型和 controller - 如果重写该代码,它们的编写是为了表示复杂性使用回调):

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

});

Generator functions/yields, async/await (es2017), 等等都可以用来解决问题,不用嵌套

提前致谢。

有两点错误:

  • 无法同步调用 Mongoose 方法(无论如何,同步完成对数据库的调用根本不是一个好主意)。
  • 在 ES6 Class 的构造函数中也不能使用 async/await 和生成器。在这个.
  • 中有解释

如果您不想要嵌套代码,一个简单的选择是使用 async/await(目前在 Node.js 中使用标志可用,不推荐用于生产)。由于 Mongoose 方法 return 承诺它们可以与 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');
});

老问题,但我想分享一个我在前几次搜索中没有看到的处理这个问题的方法。

我想从模型中获取数据,运行 一些逻辑和 return 该逻辑的结果。我需要一个围绕我对模型的调用的承诺包装器。

下面是一个稍微抽象的函数,它采用一个模型来 运行 一个 mongoose/mongo 查询,以及一些参数来帮助它做一些逻辑。然后它 returns 承诺或拒绝中预期的价值。

export function promiseFunction(aField: string, aValue, model: Model<ADocument, {}>): Promise<aType> {
    return new Promise<string>((resolve, reject) => {
      model.findOne({[aField]: aValue}, (err, theDocument) => {
        if(err){
          reject(err.toString());
        } else {
          if(theDocument.someCheck === true){
            return(theDocument.matchingTypeField)
          } else {
            reject("there was an error of some type")
          }
        }
      });
    })    
}