Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 简化调用刷新令牌的节点请求代码_Javascript_Node.js_Express - Fatal编程技术网

Javascript 简化调用刷新令牌的节点请求代码

Javascript 简化调用刷新令牌的节点请求代码,javascript,node.js,express,Javascript,Node.js,Express,假设我在通过节点请求模块执行http请求时有一个场景。 1) 对于每个API调用,如果访问令牌有效,则返回响应。 2) 如果访问令牌无效,请调用刷新令牌以获取新的访问令牌。如果返回新的访问令牌,请再次调用相同的api,否则将用户重定向到登录页面。 我有如下代码,但我觉得对于每个api重复相同的步骤太多余了。有没有办法简化这个过程?我期待这样的结果: 最终期望代码: var callApiA = { .. .. shouldCallRefre

假设我在通过节点请求模块执行http请求时有一个场景。
1) 对于每个API调用,如果访问令牌有效,则返回响应。
2) 如果访问令牌无效,请调用刷新令牌以获取新的访问令牌。如果返回新的访问令牌,请再次调用相同的api,否则将用户重定向到登录页面。

我有如下代码,但我觉得对于每个api重复相同的步骤太多余了。有没有办法简化这个过程?我期待这样的结果:

最终期望代码:

    var callApiA = {
        ..
        ..
        shouldCallRefreshToken: true
    }
    request(callApiA, function(err, response, body) {
        if(response.statusCode === 200) {
            res.json(body);
        }
    });
当前代码:

request(callApiA, function(err, response, body) {
    if (response.statusCode === 200) {
        res.json(body);
    } else if (body.invalidToken) {
        if (refresh token still exist) {
            request(callRefreshToken, function(err, response, body) {
                if (response.statusCode === 200) {
                   request(callApiA, function(err, response, body) {
                        if(body.invalidToken) {
                            res.redirect('/login');
                        } else if (response.statusCode === 200) {
                            res.json(body);
                        } else {
                            res.json('unknown error');
                        }
                   });
                } else {
                   res.redirect('/');
                }
            });
        } else {
            res.redirect('/login');
        }
    } else {
        response.json('Unknown error');
    }
});

像这样的东西可能更干净一些

function reqApis(call, callback){
    request(call, callback);
}
function reqTokenCallback( err, response, body) {
   if (response.statusCode === 200) {
      reqApis(callApiA, reqApiCallback);
   } else {
      res.redirect('/');
   }
}
function reqApiCallback( err, response, body ) {
   if (response.statusCode === 200) {
        res.json(body);
    } else if (body.invalidToken) {
        if (refresh token still exist) {
            reqApis(callRefreshToken, reqTokenCallback);
        } else {
            res.redirect('/login');
        }
    } else {
        response.json('Unknown error');
    }
}

reqApis(callApiA, reqApiCallback);

请注意……如果您想简化节点异步请求,请研究使用承诺,如果您愿意,您仍然可以使用请求: