【问题标题】:Calling same request again in node express在 node express 中再次调用相同的请求
【发布时间】:2016-08-21 08:56:54
【问题描述】:

我正在使用 Express 将请求代理到受 OAuth 2 访问令牌保护的单独 API 服务器。当令牌过期时,服务器将返回一个 401,我现在正在路由器中间件中处理它,然后刷新与客户端会话关联的访问令牌(我使用的是 express-session)。

这是我的代码:

router.js

app.use('/api', require('./routes.js'));

routes.js

var express = require('express'),
  router = express.Router(),
  routesController = require('./routes.controller.js');

router.route('/*')
  .get(routesController.fetch);

routes.controller.js

module.exports.fetch = function(req, res, next) {
  var options = helpers.buildAPIRequestOptions(req);
  request(options, function(err, response, body){
    if(response.statusCode === 401) {
      authController.refreshToken(req, res, next);
    } else {
      res.status(response.statusCode).send(body);
    }
  });
};

authController

module.exports.refreshToken = function(req, res, next) {
  var formData = {
      grant_type: 'refresh_token',
      refresh_token: req.session.refreshToken,
      scope: 'PRODUCTION'
    },
    headers = {
      'Authorization' : 'Basic ' + consts.CLIENT_KEY_SECRET_BASE64_DEV
    };
  request.post({url:consts.ACCESS_TOKEN_REQUEST_URL_DEV, form:formData, headers: headers, rejectUnauthorized: false}, function(err, response, body){
    var responseBody = JSON.parse(body);
    if (response.statusCode === 200) {

      req.session.accessToken = responseBody.access_token;
      req.session.refreshToken = responseBody.refresh_token;
      next();
      //How to recall the original request made from fetch controller function after this point?
    } else {
      console.log('SOMETHING ELSE HAPPENED!');
    }
  });
};

更新令牌后,我想重新发出我使用提取控制器中的request 模块触发的原始​​ API 请求。

我有点难过我实际上是如何做到这一点的,有没有一种优雅的方式来实现这一点?

【问题讨论】:

    标签: node.js express middleware node-request


    【解决方案1】:

    我会将身份验证控制器从中间件变成一个承诺。然后使fetch递归。

    routes.controller.js

    module.exports.fetch = fetch;
    
    function fetch(req, res, next) {
      var options = getSavedOptsFromRequest(req) || helpers.buildAPIRequestOptions(req);
      request(options, function(err, response, body){
        if(response.statusCode === 401) {
          saveOptsToRequest(req, options)
          authController.refreshToken(req)
          .then(function authOk(){
              fetch(req, res, next);
          })
          .catch(function authKo(){
              res.status(500).send('something');
          });
        } else {
          res.status(response.statusCode).send(body);
        }
      });
    };
    
    function saveOptsToRequest(req, options){
        req.requestedOptions = options;
    }
    
    function getSavedOptsFromRequest(req){
        return req.requestedOptions;
    }
    

    authController

    module.exports.refreshToken = function(req) {
        var refreshTokenPromise = new Promise(function (resolve, reject){
            var formData = {
                grant_type: 'refresh_token',
                refresh_token: req.session.refreshToken,
                scope: 'PRODUCTION'
                },
                headers = {
                'Authorization' : 'Basic ' + consts.CLIENT_KEY_SECRET_BASE64_DEV
                };
            request.post({url:consts.ACCESS_TOKEN_REQUEST_URL_DEV, form:formData, headers: headers, rejectUnauthorized: false}, function(err, response, body){
                var responseBody = JSON.parse(body);
                if (response.statusCode === 200) {
    
                req.session.accessToken = responseBody.access_token;
                req.session.refreshToken = responseBody.refresh_token;
                resolve();
                //How to recall the original request made from fetch controller function after this point?
                } else {
                console.log('SOMETHING ELSE HAPPENED!');
                reject(new Error("Something!!!!"));
                }
            });
        });
        return refreshTokenPromise;
    };
    

    【讨论】:

      猜你喜欢
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      相关资源
      最近更新 更多