在花费了将近一个星期的时间来尝试为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
    }
);


gCtrl模块,用于调用Google API

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

  };

最佳答案

您缺少对如何从异步操作返回值的理解。 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,并使其成为一个异步函数,该异步函数在有数据时使用回调或Promise进行通信,然后对Express处理程序进行编码以调用该函数并适当地使用该异步返回值。在上面的代码中,我选择使用已经构建的中间件体系结构来处理异步响应。

关于node.js - Express Manipulating req对象传递给下一个中间件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40601485/

10-14 17:23