Express Manipulating req对象传递给下一个中间件

时间:2016-11-15 03:24:18

标签: node.js express

在花了将近一周的时间尝试为Google令牌实施护照策略失败之后,我决定使用针对Google API的Nodejs客户端库自行编写。我在$ http请求中传递来自angularjs的accesstoken,并希望在服务器端进行身份验证后将登录用户返回到调用。 我将登录用户传递给req对象时遇到了麻烦,因此我可以将其传递给下一个中间件。任何帮助将不胜感激。

**express code**

路由器

var gCtrl = require('./googleController.js');
app.post('/auth/google/accesstoken',


      function (req, res) {
         console.log('Im in the google auth middleware');

     //below line is not returning the gUser so I can pass it to the next middleware
        var gUser=gCtrl(req.token);

        res.send(gUser); 
}, 
 function(req,res){
    //do something with authenticated user
    }
);

进行Google API调用的gCtrl模块

var ubCust = require('../models/ubCust.js');
var bodyParser = require('body-parser');

var google=require('googleapis');
var plus = google.plus('v1');
var OAuth2 = google.auth.OAuth2;
var oauth2client = new OAuth2('1094664898379-8u0muh9eme8nnvp95dafuc3rvigu4j9u.apps.googleusercontent.com','KQ_vNDaZzTvXDdsfgp5jqeZW','http://localhost:3000/auth/google/callback');


module.exports = function(acc_token){


        //console.log(acc_token);
         oauth2client.setCredentials({
            access_token : acc_token
        //refresh_token: token.refresh_token
        });

        plus.people.get({
            userId:'me',
            auth:oauth2client
        },function(err,response){
            if (err) 
                throw err;
            //console.log('google user',response);
            return response;
        });

  };

1 个答案:

答案 0 :(得分:3)

您无法理解如何从异步操作返回值。你的gCtrl模块中有return response的地方只是将值内部返回到plus.people.get()内的异步操作。这不会从module.exports函数返回值。这个功能早已回归。

您可以在这里阅读有关从异步操作返回值的一般概念:How do I return the response from an asynchronous call?。您将需要使用回调函数或promise来回传异步值。你不能直接退货。

现在,在您的特定情况下,您可以使用gCtrl模块作为Express中间件,将中间令牌值设置为中间件处理程序中的req对象,然后使用next()传达它现在是时候为请求调用主处理程序。你可以这样做:

// gtrl - Express middleware handler
// the purpose of this middleware is to process req.token 
//    and set req.tokenResponse for further processing
//    in the next step of the middleware/request handler processing
module.exports = function(req, res, next) {
     oauth2client.setCredentials({
        access_token : req.token
    //refresh_token: token.refresh_token
    });

    plus.people.get({
        userId:'me',
        auth:oauth2client
    }, function(err,response){
        if (err) {
            // communicate back error in some fashion, may want to return a 5xx response for an internal error
            next(err);
        } else {
            // set value into req object for later consumption
            req.tokenResponse = response;
            // call next handler in the chain
            next();
        }
    });
  };

// router
var gCtrl = require('./googleController.js');

// use gCtrl middleware to do async processing on req.token
app.post('/auth/google/accesstoken',  gCtrl, function(req, res) {
    // req.tokenResponse is set here by the gCtrl middleware
    // do something with authenticated user

    // send some sort of response here
    res.send(...);
});

注意:为了使这项工作,我们必须专门使gCtrl导出的函数与快速中间件的函数签名匹配,并直接从req对象检索令牌。您可以使gCtrl模块独立于Express,并使其成为异步函数,使用回调函数或承诺在它拥有数据时进行通信,然后对快速处理程序进行编码以调用该函数,适当地使用该异步返回值。在我上面的代码中,我选择使用已经构建的中间件架构来处理异步响应。