Javascript 如何将数据从中间件传递到路由器?

Javascript 如何将数据从中间件传递到路由器?,javascript,node.js,reactjs,react-native,jwt,Javascript,Node.js,Reactjs,React Native,Jwt,我们在getpost路由器中有authenticateToken中间件。authenticateToken中间件验证令牌 如果令牌已过期,则执行If(err)条件语句。此时,通过refreshtoken再次发出accessToken 我想把这个颁发的accessToken传递给路由器。日志(accessToken);如何修复代码以执行此操作 这是我的密码 (index.js) (middleware.js) 我想你可以这样做 exports.authenticateToken=(请求、恢复、下一

我们在getpost路由器中有authenticateToken中间件。authenticateToken中间件验证令牌

如果令牌已过期,则执行If(err)条件语句。此时,通过refreshtoken再次发出accessToken

我想把这个颁发的accessToken传递给路由器。日志(accessToken);如何修复代码以执行此操作

这是我的密码

(index.js)

(middleware.js)


我想你可以这样做

exports.authenticateToken=(请求、恢复、下一步)=>{
jwt.verify(令牌,process.env.ACCESS\u令牌\u SECRET,异步(err,user)=>{
如果(错误){
验证(
刷新令牌,
process.env.REFRESH\u TOKEN\u SECRET,
异步(错误,用户)=>{
if(err)返回res.sendStatus(403);
const accessToken=wait generateAccessToken(用户);//我想把这个accessToken传递给路由器
//向req对象添加令牌
req.accessToken=accessToken
//加上这个
下一个()
},
);
res.json({accessToken:accessToken});
}否则{
req.user=用户;
next();
}
});
};
函数generateAccessToken(用户){
返回jwt.sign(user,process.env.ACCESS_TOKEN_SECRET,{expiresIn:'55s'});
}
您使用req对象传递令牌,并像下面这样在路由中获取令牌

router.post('/getpost',authenticateToken,async(req,res,next)=>{
试一试{
//通过req对象访问令牌
控制台日志(请求访问令牌);
}捕获(错误){
控制台错误(error);
下一步(错误);//状态500
}
});

编辑:根据有问题的代码编写示例

我认为您可以这样做

exports.authenticateToken=(请求、恢复、下一步)=>{
jwt.verify(令牌,process.env.ACCESS\u令牌\u SECRET,异步(err,user)=>{
如果(错误){
验证(
刷新令牌,
process.env.REFRESH\u TOKEN\u SECRET,
异步(错误,用户)=>{
if(err)返回res.sendStatus(403);
const accessToken=wait generateAccessToken(用户);//我想把这个accessToken传递给路由器
//向req对象添加令牌
req.accessToken=accessToken
//加上这个
下一个()
},
);
res.json({accessToken:accessToken});
}否则{
req.user=用户;
next();
}
});
};
函数generateAccessToken(用户){
返回jwt.sign(user,process.env.ACCESS_TOKEN_SECRET,{expiresIn:'55s'});
}
您使用req对象传递令牌,并像下面这样在路由中获取令牌

router.post('/getpost',authenticateToken,async(req,res,next)=>{
试一试{
//通过req对象访问令牌
控制台日志(请求访问令牌);
}捕获(错误){
控制台错误(error);
下一步(错误);//状态500
}
});

编辑:根据问题中的代码编写示例

我尝试了你的代码,但没有成功…@jackvolten我编辑了答案,请检查答案,我重试,但出现了此错误:accessToken不可用defined@jackvolten未定义accessToken,因为
jwt.verify(…)
是异步的,并且
next()在设置accessToken之前调用
。我再次编辑了答案,在第一次回调中添加了
else
语句,在刷新令牌回调中添加了
next()!!它工作!!!但我想知道这有必要吗?res.json({accessToken:accessToken});????我尝试了你的代码,但它不起作用…@jackvolten我编辑了答案,请检查它。我重试,但出现了此错误:accessToken不可用defined@jackvolten未定义accessToken,因为
jwt.verify(…)
是异步的,并且在设置accessToken之前调用了
next()
。我再次编辑了答案,在第一次回调中添加了
else
语句,在刷新令牌回调中添加了
next()!!它工作!!!但我想知道这有必要吗?res.json({accessToken:accessToken});????你能用你更新的本地代码更新有问题的代码吗?这样我就可以帮助你尝试什么了。你能用你更新的本地代码更新有问题的代码吗?这样我就可以帮助你尝试什么了
    router.post('/getpost', authenticateToken, async (req, res, next) => {
      try {
        console.log(accessToken);
      } catch (error) {
        console.error(error);
        next(error); // status 500
      }
    });
      exports.authenticateToken = (req, res, next) => {

        jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, async (err, user) => {
          if (err) {
            jwt.verify(
              refreshToken,
              process.env.REFRESH_TOKEN_SECRET,
              async (err, user) => {
                if (err) return res.sendStatus(403);
                const accessToken = await generateAccessToken(users); // i want to pass this  accessToken to router
                console.log('accessToken::::', accessToken);
            
              },
            );
            res.json({accessToken: accessToken});
          }
          req.user = user;
          next();
        });
      };

      function generateAccessToken(user) {
        return jwt.sign(user, process.env.ACCESS_TOKEN_SECRET, {expiresIn: '55s'});
      }




    app.post("/token", (req, res) => {
      const refreshToken = req.body.token;
      console.log("refreshToken:", refreshToken);
      if (refreshToken == null) return res.sendStatus(401);
      if (!refreshTokens.includes(refreshToken)) return res.sendStatus(403);
      jwt.verify(refreshToken, process.env.REFRESH_TOKEN_SECRET, (err, user) => {
        if (err) return res.sendStatus(403);
        const accessToken = generateAccessToken({ name: user.name });
        res.json({ accessToken: accessToken });
      });
    });