2016-11-15 2 views
0

Проведя попытку реализовать паспортную стратегию для токена google неудачно, я решил написать его сам, используя клиентскую библиотеку Nodejs для Google API. Я передаю accesstoken из angularjs в запросе $ http и хочу вернуть зарегистрированного пользователя на вызов после аутентификации на стороне сервера. У меня возникли проблемы с передачей подписанного пользователя пользователю req, поэтому я могу передать его следующему промежуточному программному обеспечению. Любая помощь будет оценена.Экспресс Манипулирование объекта 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 модуль, который делает API вызов Google

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

    }; 
+0

Имеет ли req.token значение? –

ответ

2

У вас не хватает понимания того, как один возвращает значения из асинхронной операции. Где у вас есть return response в вашем модуле gCtrl, просто возвращаю значение внутри, независимо от того, какая операция асинхронна внутри plus.people.get(). Это не вернет значение из вашей функции module.exports. Эта функция уже давно вернулась.

Вы можете прочитать об общей концепции возвращаемых значений от операции async здесь: How do I return the response from an asynchronous call?. Вам нужно будет использовать либо функцию обратного вызова, либо обещание обмениваться асинхронным значением. Вы не можете вернуть его напрямую.

Теперь в вашем конкретном случае, вы можете использовать свой gCtrl модуль в качестве экспресса промежуточного слоя, где вы установите промежуточное значение маркеров в 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 и просто сделать его асинхронной функцией, которая использует обратный вызов или обещание обмениваться данными, когда у него есть данные, а затем закодировать экспресс-обработчик для вызова этой функции и соответствующим образом использовать возвращаемое значение async. В моем коде выше я решил использовать уже построенную промежуточную архитектуру для обработки асинхронного ответа.

Смежные вопросы