You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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或错误信息,快速定位问题。

现在测试一下:

  1. 先发送POST请求到/api/token,会得到一个有效的JWT。
  2. 再发送POST请求到/api/login,在请求头的Authorization字段填入Bearer <你的token>,就能正常收到响应了。

内容的提问来源于stack exchange,提问作者typicallearner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:31:31