nodejs异步中间件无法正常工作

时间:2017-07-18 12:28:57

标签: node.js express mongoose middleware

我正在尝试在nodejs,express和mongodb中创建OAuth身份验证流程。我想在每条路线之前检查我的MongoDB中是否有客户端。所以我做了一个中间件功能,检查我的数据库中是否有客户端ID和客户端密码。这是我的中间件功能

module.exports = function() {
    return function(req, res, next) {
        // Implement the middleware function based on the options object

        winston.info("check client")
        User.getClient(req.get("clientId"), req.get("clientSecret"), function (err, client) {
            winston.info("checking time");
            if (client) {
                return next();
            } else {

            }
        });

        winston.info("check client done")
    }
}

但是当我调用我的猫鼬模型时,我认为我的中间件并不完美。到异步调用结束时。脚本正在通过。 所以我想在这里实现的是,如果客户端在我们的数据库中可用,则中间件应该通过。所以中间件必须在得到猫鼬的响应之后继续前进。这是我的路由器代码。

var express = require('express')
    , router = express.Router()
    , clientVerify = require("../middlewares/clientVerify");

router.use(clientVerify())

1 个答案:

答案 0 :(得分:0)

我用诺言解决了这个问题。感谢@Vassilis Pallas在评论中的指导。

return new Promise( function(resolve,reject){
            User.getClient(req.get("clientId"), req.get("clientSecret"), function (err, client) {
                winston.info(client);
                if (client) {
                    resolve( client );
                } else {
                    res.status(401).send({
                        status: 401,
                        message: "unauthorized"
                    });
                }
            });
        }).then(function(saveResult){
            saveResult = saveResult && typeof saveResult == 'object' ? saveResult.toJSON() : saveResult;
            winston.info(saveResult);
            if (saveResult)
                return next();
        });