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

Express.js+Nodemon中使用JWT的req.user导致应用崩溃

Typescript + Express 中使用 req.user 导致 nodemon 崩溃的问题

昨天开始遇到一个棘手问题,尝试多种方案都没解决。我用Typescript开发Express应用,nodemon启动开发服务器,之前一切正常,直到实现了一个需要req.user.id的路由——现在只要代码里用到req.user的地方,nodemon就会崩溃,提示:

"[nodemon] app crashed - waiting for file changes before starting..."

代码详情

测试控制器(src/controllers/profileControllers.ts)

这是一个简化的测试函数,但问题依然存在:

export const testUserProperty = async (req: Request, res: Response) => {
    try {
      if (!req.user || !req.user.id) {
        return res.status(401).json({ error: 'Utilisateur non authentifié.' });
      }
      const userId = req.user.id;
      const user: IUser | null = await User.findById(userId).select('-password');
      if (!user) {
        return res.status(404).json({ error: 'Utilisateur non trouvé.' });
      }
      res.status(200).json(user);
    } catch (error) {
      res.status(500).json({ error: 'Erreur lors de la récupération du profil.' });
    }
  };

路由配置(src/routes/profileRoutes.ts)

router.get('/profile', authenticate, testUserProperty);

所有模块均已正确导入。

JWT生成逻辑(src/controllers/authController.ts)

登录时生成token,确认token包含userId和email:

const token = jwt.sign(
    { userId: user._id, email: user.email },
    process.env.JWT_SECRET as string,
    { expiresIn: "1h" }
);

认证中间件(src/middlewares/authMiddleware.ts)

export const authenticate = (req: Request, res: Response, next: NextFunction) => {
    const authHeader = req.header("Authorization");
    const token = authHeader && authHeader.split(" ")[1];
    if (!token) {
        return res.status(401).json({ message: "Accès refusé, token manquant." });
    }

    try {
        const decoded = jwt.verify(token, process.env.JWT_SECRET as string) as { userId: string, email: string };
        req.user = { id: decoded.userId, email: decoded.email };

        if (!req.user || !req.user.id) {
            return res.status(401).json({ error: 'Utilisateur non authentifié.' });
          }

        next();
    } catch (error) {
        res.status(401).json({ error: "Token invalide" });
    }
};

Typescript全局类型定义(types/global.d.ts)

为扩展Express的Request接口添加了全局类型:

declare namespace Express {
    export interface Request {
      user?: {
        id: string;
        email: string;
      };
    }
  }

tsconfig.json中已配置"include": ["src", "types"]。

已尝试的方案

  • 反复检查代码逻辑,未发现明显错误
  • 咨询过GPT 4o和GPT o3_mini_high,未能解决
  • 尝试在控制器中使用继承自Request的自定义接口,问题依旧
  • 将所有req.user替换为req.body.user测试,服务器运行完全正常,确认问题与req.user的使用直接相关

求助方向

希望能得到排查方向或解决方案,如需更多信息可随时提供,也欢迎有相同问题的开发者一起探讨。

内容的提问来源于stack exchange,提问作者Guillaume D.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:35:09