【问题标题】:Express Manipulating req object to pass to next middleware快速操作 req 对象以传递给下一个中间件
【发布时间】:2017-03-28 20:13:01
【问题描述】:

在花了将近一周的时间尝试为 google 令牌实施护照策略失败后,我决定使用 Nodejs 客户端库为 Google API 自己编写它。我在 $http 请求中从 angularjs 传递访问令牌,并希望在服务器端进行身份验证后将登录用户返回到调用。 我无法将登录用户传递给 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;
        });

  };

【问题讨论】:

  • req.token 有值吗?

标签: node.js express


【解决方案1】:

您不了解如何从异步操作中返回值。 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 导出的函数与 express 中间件的函数签名匹配,并直接从 req 对象中检索令牌。您可以使 gCtrl 模块独立于 Express 并使其成为一个异步函数,该函数使用回调或承诺在它拥有数据时进行通信,然后编写 express 处理程序以调用该函数并适当地使用该异步返回值.在上面的代码中,我选择使用已经构建的中间件架构来处理异步响应。

【讨论】:

    猜你喜欢
    • 2015-09-28
    • 2014-05-04
    • 2022-01-17
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多