TypeScript开发Next.js+Express应用遇Express调用重载匹配错误
解决Express异步中间件的TypeScript重载匹配错误
错误原因分析
Express的RequestHandler类型要求异步中间件返回Promise<void>,但你的isAuthenticated是async函数,且在代码中直接return res.status(...).json(...),这导致函数返回的是Promise<Response | undefined>,与类型要求不匹配,从而触发重载错误。
修复方案
移除所有返回响应对象的return语句,直接调用res的响应方法即可——Express中间件不需要返回响应对象,调用res.json()/res.status()等方法就会结束请求流程。
修改后的中间件代码:
import { NextFunction, Request, Response } from "express"; // 补充:需要引入jsonwebtoken库用于解码token import jwt from "jsonwebtoken"; declare global { namespace Express{ interface Request { id: string; } } } export const isAuthenticated = async (req: Request, res: Response, next: NextFunction) => { try { const token = req.cookies.token; if (!token) { // 直接调用响应方法,不返回响应对象 res.status(401).json({ success: false, message: "User not authenticated" }); return; // 提前退出函数,避免后续代码执行 } // 补充token解码逻辑(示例,需替换为你的密钥) const decoded = jwt.verify(token, process.env.JWT_SECRET!) as { userId: string }; req.id = decoded.userId; next(); } catch (error) { // 同样直接调用响应方法 res.status(500).json({ message: "Internal server error" }); return; } }
额外注意点
原代码中decode变量未定义,需补充JWT解码逻辑(如使用jsonwebtoken库的verify方法),否则运行时会出现变量未定义错误。
内容的提问来源于stack exchange,提问作者Wasif Rehman
相关产品推荐
相关产品推荐

