打字稿错误:属性“用户”的类型“请求”
不存在,我有以下我的快递应用程序的代码打字稿错误:属性“用户”的类型“请求”
router.get('/auth/userInfo', this.validateUser, (req, res) => {
res.json(req.user);
});
和我的IDE似乎与错误
抱怨error TS2339: Property 'user' does not exist on type 'Request'.
当我编译我的打字稿代码似乎是抛出这个错误。任何想法为什么发生这种情况?
req可能是类型为“express”包的请求,并且用户在那里不存在。您必须扩展请求与自己的路由器处理程序或强制它输入任何或对象。
尝试res.json(req['user'])
或res.json((<any>req).user)
您也可以使用模块/全球增强
declare module "express" { // declare module "express-serve-static-core"
export interface Request {
user: any
}
}
你也可以让自己的处理程序的包装(而不是ExpressJs扩展路由器功能)。
import * as express from 'express';
interface IUserRequest extends express.Request {
user: any
}
function myHandler(handler: (req: IUserRequest, res: express.Response, next?: express.NextFunction) => any) {
return (req: express.Request, res: express.Response, next: express.NextFunction) => {
try {
validateUser(req, res, (err) => { // your validateUser handler that makes a user property in express Request
if(err)
throw err;
let requestWrapper: IUserRequest = <IUserRequest>req;
handler(requestWrapper, res, next);
})
}
catch (ex) {
next(ex);
}
}
}
let app = express();
// init stuff for express but this.validateUser handler is not needed
app.use('/testuser', myHandler((req, res) => {
res.json(req.user);
}));
虽然这些是有效的解决方法,但它们没有办法解决TypeScript帮助指出的底层问题:不保证请求具有用户属性。 –
@MadaraUchiha我完全同意,首先想到扩展路由器,但这是一个工作。为了简化你可以使用一个处理程序包装。我编辑我的答案包括一个例子。 – Lostfields
你能解释一下'module/global augmentation'方法吗?我不知道如何设置它与TS 2.5(和快递类型安装在@ types/express) – BrunoLM
我们写在快递和打字稿大量API,这是我们如何处理这样的场景:
我们保持请求定义在一个文件中:
import { Request } from "express"
export interface IGetUserAuthInfoRequest extends Request {
user: string // or any other type
}
然后在我们正在编写控制器功能的文件:
import { Response } from "express"
import { IGetUserAuthInfoRequest } from "./definitionfile"
app.get('/auth/userInfo', validateUser, (req: IGetUserAuthInfoRequest, res: Response) => {
res.status(200).json(req.user); // Start calling status function to be compliant with Express 5.0
});
请注意,“用户”我这不是在Express的Request对象中本地可用的属性。确保您使用的是将这种属性添加到请求对象的中间件。
这也是一种欺骗打字稿的方法,它不能保证有@MadaraUchiha指出的用户对象(...并且低估了我的:-P)。建立专门的路由器来完成所有这些会更好。 – Lostfields
可能是因为在req上缺少类型 - 快速修复(req:any,res:any)=> ...否则你可能需要使用一些[类型info for express](https://stackoverflow.com/questions/36037977 /如何安装-express-type-typings) –