Javascript 如何使用路由前认证中间件获取令牌

Javascript 如何使用路由前认证中间件获取令牌,javascript,node.js,express,authentication,middleware,Javascript,Node.js,Express,Authentication,Middleware,我怎样才能解决这个问题? 我希望在路由器中获取令牌,然后路由器发送响应。但在这个中间件中,我的代码在调用路由后获取令牌。我如何访问中间件令牌以验证用户 var express=require(“express”); var请求=要求(“请求”); var router=express.router(); var超令牌; 令牌中间件=函数(req、res、next){ log(“这是身份验证中间件”); 试一试{ 变量选项={ 方法:“张贴”, url:“这是我的身份验证服务器url”, 标题:{

我怎样才能解决这个问题? 我希望在路由器中获取令牌,然后路由器发送响应。但在这个中间件中,我的代码在调用路由后获取令牌。我如何访问中间件令牌以验证用户

var express=require(“express”);
var请求=要求(“请求”);
var router=express.router();
var超令牌;
令牌中间件=函数(req、res、next){
log(“这是身份验证中间件”);
试一试{
变量选项={
方法:“张贴”,
url:“这是我的身份验证服务器url”,
标题:{
是的,
授权:“//
“内容类型”:“应用程序/x-www-form-urlencoded”
}
},
表格:{
授权类型:“密码”,
用户名:“usrename”,
密码:“密码”
};
请求(选项、功能(错误、响应、正文1){
如果(错误){
抛出新错误(Error);
}否则{
让info=JSON.parse(body1);
//它将body1解析为json,这样我们就可以使用body1的属性。
supertoken=info.access\u token;//它给出超级管理员的令牌。
//console.log(超级令牌)
//console.log(process.env.ACCESS_令牌);
//返回超级令牌
}
});
console.log(“superrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr”);
console.log(超级令牌);
next();
}捕获(错误){
返回res.status(401).json({message:“Auth Failed.”});
}
}; //这给了我一个代币。
路由器.post(“/verifyUser”),令牌中间件(req,res)=>{
//这里我想要我的中间件令牌(但它在路由后调用)
//这里我应用了验证用户的逻辑,但令牌不起作用。(它说是未定义的)
});

您的中间件包含一个异步操作请求。然后在请求回调之外调用
next()
。在中间件调用您后,在请求完成之前激发
next()
,只需在请求回调中移动next

    tokenmiddleware = function (req, res, next) {
      console.log('this is auth middleware');
      try {
        var options = {
          method: 'POST',
          url: 'here is my auth server url',
          headers: {
            json: true,
            Authorization: '', //
            'Content-Type': 'application/x-www-form-urlencoded',
          },
          form: {
            grant_type: 'password',
            username: 'usrename',
            password: 'password',
          },
        };
        request(options, function(error, response, body1) {
          if (error) {
            throw new Error(error);
          } else {
            let info = JSON.parse(body1);
            //it parse the body1 into json so we can use property of body1.
            supertoken = info.access_token; //it gives the token of the super admin.
            // console.log(supertoken)
            console.log('superrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr');
            console.log(supertoken);
            req.userToken = info.access_token;
            next();
          }
        });
      } catch (error) {
        return res.status(401).json({ message: 'Auth Failed.' });
      }
    };

router.post("/verifyUser", tokenmiddleware, (req, res) => {
  console.log(req.userToken); // should be your token
});

请将代码的格式设置为可读。您的空格非常少,缺少和错误的缩进。如果你努力使你的问题易于阅读和理解,你将更有可能在这里得到人们的帮助。我们都是志愿者。我们更关注容易理解的问题。老实说,如果不将代码复制到编辑器并通过一些代码格式化程序运行它以提供一致、可读的样式,我就无法读取您的代码,因此我放弃了尝试理解它。仅供参考,
if(error){throw new error(error)
异步回调内部永远不应该存在。这没有任何用处。它只是将某些异步代码存根抛出,您永远无法捕获它。您需要真正的错误处理,您甚至不应该从中开始编写代码。我的问题是,我无法获取supertoken值(位于请求方法中的中间件中)。我希望此值用于authenticaton。谢谢,但我希望在router.post()中使用中间件的supertoken,因为我希望传入route.post()的另一个请求函数中的标头我不确定您是否理解正确,但您可以将令牌值作为附加参数添加到您的请求对象。我已更新并回答