如何在Post请求中调用外部文件的JWT?代码导出后请求异常求助
问题分析与解决方案
看起来你把JWT逻辑拆分到独立文件后遇到了请求挂起的问题,这主要是两个核心原因导致的:
1. 未实际调用导出的处理函数
在你的app.js里,你只是写了jwt.verifyJWT和jwt.signJWT,但并没有执行这些函数。Express的路由需要处理函数实际运行才能响应请求,否则请求会一直处于等待状态。
2. 导出函数未接收req和res参数
jwt.js里的verifyJWT和signJWT直接使用了req和res,但这两个参数并没有被传入函数,会导致ReferenceError,就算调用了函数也无法正常工作。
修改后的jwt.js
给两个核心函数添加req和res参数,确保能访问请求和响应对象:
const jwt = require("jsonwebtoken"); // 接收req、res参数,才能访问请求里的token和发送响应 function verifyJWT(req, res) { jwt.verify(req.token, "fortest", (err, authData) => { if (err) { res.sendStatus(403); } else { // 用JSON.stringify转换authData,避免输出[Object object] res.json( `Logged in with ${req.token} and here is some data for you ${JSON.stringify(authData)}` ); } }); } // 接收req、res参数,同时建议传入实际用户数据(而非空对象) function signJWT(req, res) { jwt.sign({ username: "test_user" }, "fortest", (err, token) => { if (err) { res.sendStatus(511); } else { res.json({ token }); } }); } function verifyToken(req, res, next) { const headers = req.headers["authorization"]; if (typeof headers !== "undefined") { const tokenArray = headers.split(" "); const theToken = tokenArray[1]; req.token = theToken; next(); } else { res.sendStatus(403); } } // 用对象形式导出更简洁 module.exports = { verifyJWT, signJWT, verifyToken };
修改后的app.js
在路由里调用导出的函数,并传入req和res:
const express = require("express"); const app = express(); // 重命名为jwtUtils,避免和jsonwebtoken库的变量名冲突 const jwtUtils = require("./jwt"); // 验证token的路由:调用verifyJWT并传递req、res app.post("/api/login", jwtUtils.verifyToken, (req, res) => { jwtUtils.verifyJWT(req, res); }); // 生成token的路由:调用signJWT并传递req、res app.post("/api/token", (req, res) => { jwtUtils.signJWT(req, res); }); // 别忘了启动服务器,之前的代码里漏掉了这部分 const PORT = 3000; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); });
额外小建议
- 避免变量名冲突:把导入的自定义模块命名为
jwtUtils,和jsonwebtoken库的jwt区分开,代码更清晰。 - 传递实际数据:
signJWT里建议传入真实的用户信息(比如用户名、ID),这样验证后的authData才有实际业务意义。 - 调试提示:如果还是有问题,可以在函数里加
console.log打印req.token或错误信息,快速定位问题。
现在测试一下:
- 先发送POST请求到
/api/token,会得到一个有效的JWT。 - 再发送POST请求到
/api/login,在请求头的Authorization字段填入Bearer <你的token>,就能正常收到响应了。
内容的提问来源于stack exchange,提问作者typicallearner
相关产品推荐
相关产品推荐

