2017-07-18 154 views
0

我想在nodejs,express和mongodb中自己做一个OAuth身份验证流程。我正试图在每个路由之前检查客户端是否在我的MongoDB中可用。所以我做了一个中间件功能,检查客户端ID和客户端密钥是否可用在我的数据库中。这里是我的中间件功能nodejs异步中间件不起作用

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()) 
+0

您是否尝试用promise返回用户对象? –

+0

没有。你能指导我做一个例子吗? – coder

+0

查看[this](https://stackoverflow.com/a/35247560/3763848)示例 –

回答

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