2017-06-06 50 views
1

不存在,我有以下我的快递应用程序的代码打字稿错误:属性“用户”的类型“请求”

router.get('/auth/userInfo', this.validateUser, (req, res) => { 
    res.json(req.user); 
}); 

和我的IDE似乎与错误

error TS2339: Property 'user' does not exist on type 'Request'.

抱怨

当我编译我的打字稿代码似乎是抛出这个错误。任何想法为什么发生这种情况?

+0

可能是因为在req上缺少类型 - 快速修复(req:any,res:any)=> ...否则你可能需要使用一些[类型info for express](https://stackoverflow.com/questions/36037977 /如何安装-express-type-typings) –

回答

1

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); 
})); 
+0

虽然这些是有效的解决方法,但它们没有办法解决TypeScript帮助指出的底层问题:不保证请求具有用户属性。 –

+0

@MadaraUchiha我完全同意,首先想到扩展路由器,但这是一个工作。为了简化你可以使用一个处理程序包装。我编辑我的答案包括一个例子。 – Lostfields

+0

你能解释一下'module/global augmentation'方法吗?我不知道如何设置它与TS 2.5(和快递类型安装在@ types/express) – BrunoLM

6

我们写在快递和打字稿大量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对象中本地可用的属性。确保您使用的是将这种属性添加到请求对象的中间件。

+0

这也是一种欺骗打字稿的方法,它不能保证有@MadaraUchiha指出的用户对象(...并且低估了我的:-P)。建立专门的路由器来完成所有这些会更好。 – Lostfields

相关问题