我正在使用 TypeScript 开发 Express 应用程序,但遇到了 TypeScript 无法识别 Request 对象上的用户属性的问题。具体来说,我的控制器中出现以下错误:
Property 'user' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>'.ts(2339)
这是我的控制器代码的相关部分:
export const getUserDetails = AsyncHandler(
async (req: Request, res: Response, next: NextFunction) => {
try {
if (req.user) { // <-- Error happens here
const user = await getUserDetailsService(req.user.id, req.user.email);
res.status(200).json({ success: true, user });
} else {
return next(new ErrorHandler('User not authenticated', 401));
}
} catch (error) {
return next(new ErrorHandler('Internal server error', 500));
}
}
);
我知道 req.user 在我的身份验证中间件中设置如下:
export const isAuthenticated = (req: Request, res: Response, next: NextFunction) => {
const token = req.cookies.access_token;
if (!token) {
return res.status(401).json({ message: 'Not authenticated' });
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET as string) as UserData;
req.user = decoded; // Setting req.user here
next();
} catch (error) {
return res.status(401).json({ message: 'Token is not valid' });
}
};
1。扩展 Express Request 接口:
我创建了一个文件来扩展请求接口,以便识别用户:
// src/@types/express/index.d.ts
import { UserData } from '../interfaces/user'; // Adjust the path
declare namespace Express {
interface Request {
user?: UserData; // Making it optional
}
}
2。更新了 tsconfig.json:
我确保 TypeScript 包含我的自定义类型定义:
{
"compilerOptions": {
"typeRoots": ["./node_modules/@types", "./src/@types"]
},
"include": ["src/**/*.ts", "src/@types/**/*.d.ts"]
}
3.重新启动 TypeScript 编译器: 进行这些更改后,我重新启动了 TypeScript 编译器(ts-node、nodemon),但问题仍然存在。
完全错误:
src/controllers/user.controller.ts:107:15 - error TS2339: Property 'user' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>'.
107 if (req.user) {
问题:
为了正确扩展请求接口以包含用户属性,我缺少什么?我还需要配置其他东西才能使其正常工作吗?
附加信息:
TypeScript 版本:4.0+ 快速版本:4.x 我使用 @types/express 进行类型定义。
提前感谢您的帮助!
这是因为
Request
类型默认没有任何 user
属性,在我看来它不应该有它。为了使您的案例发挥作用,您可以将类型声明更改为
async (req: Request & { user: string} , res: Response, next: NextFunction) => {}
我看到您尝试更改界面,但我认为这不是一个好主意。您应该扩展现有的接口,然后不要忘记
export
它。您当前的实现可能无法正常工作,因为您尚未导出 Request
接口。