在Express中通过中间件传递Mongoose对象



我已经设置了一个基本的记录器Mongoose DB对象,我想通过true中间件并随着应用程序的进展或特定条件更新它/编辑它。

记录器中间件。

function Logger(req, res, next) {
  Logs.findOne({ip:func.GIP(req)},function (err, log){
    if (err) console.log(err);
    if (!log) { 
        var log = new Logs({ip: func.GIP(req), user: "anonymous"});
            log.attempts = 1;
            log.save();
            next();
    }
    if (log.attempts > config.attempts) {
        return res.status(403).send({ 
            success: false 
        });
    }
    if (log.attempts <= config.attempts){
        log.attempts += 1;
        log.save();
        next();
    } 
  });
}

我的例子Route.

app.post("/example", Logger, function(req,res) {
    if(!condition){ 
        log.attempts = 0;
        log.save();
    }
});

如果不再次运行Logs.findOne({ip:f...函数,我将如何访问上面演示的log.save()对象?

只需将log变量添加到req对象:

function Logger(req, res, next) {
  Logs.findOne({ip:func.GIP(req)},function (err, log){
    if (err) console.log(err);
    if (!log) { 
        var log = new Logs({ip: func.GIP(req), user: "anonymous"});
            log.attempts = 1;
            log.save();
            req.log = log;
            next();
    }
    if (log.attempts > config.attempts) {
        return res.status(403).send({ 
            success: false 
        });
    }
    if (log.attempts <= config.attempts){
        log.attempts += 1;
        log.save();
        req.log = log;
        next();
    } 
  });
}

你可以这样访问它:

app.post("/example", Logger, function(req,res) {
    if(!condition){ 
        req.log.attempts = 0;
        req.log.save();
    }
});