2017-06-06 3 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 - fast fix '(req:any、res:any)=> ...'そうでなければ、いくつかの[express for type](https://stackoverflow.com)を使う必要があります。/questions/36037977/how-to-install-express-in-typings) –

答えて

1

reqはおそらく "express"パッケージからのRequest型であり、そこにユーザーは存在しません。要求を独自のルータハンドラで拡張するか、任意のオブジェクトまたはオブジェクトをタイプするためにそれをキャストする必要があります。

はまた、あなたはまた、(代わりにExpressJsにルータ機能を拡張する)、独自のハンドララッパーを作ることができるモジュール/グローバル増強

declare module "express" { // declare module "express-serve-static-core" 
    export interface Request { 
    user: any 
    } 
} 

を使用することができres.json(req['user'])またはres.json((<any>req).user)

を試してみてください。

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私は完全に同意します、ルーターを拡張することについて最初に考えましたが、それは少しの作業です。簡単にするために、代わりにハンドラーラッパーを使用することができます。 1つの例を含めるために私の答えを編集する。 – Lostfields

+0

'module/global augmentation'メソッドについて説明できますか?私はTS 2.5(@ types/expressにインストールされたエクスプレスタイプ) – BrunoLM

6

我々はExpressと活字体で書かれた大規模なAPIを持っており、これは、我々は、このようなシナリオを処理する方法である:

import { Request } from "express" 
export interface IGetUserAuthInfoRequest extends Request { 
    user: string // or any other type 
} 

そして中:

我々は1つのファイルに要求定義を保ちますコントローラー機能を記述しているファイル:

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

"user" i ExpressのRequestオブジェクトにネイティブに使用できるプロパティではありません。このようなプロパティをリクエストオブジェクトに追加するミドルウェアを使用していることを確認してください。

+0

これは型スクリプトを欺く方法でもあり、@MadaraUchihaが指摘しているようにユーザーオブジェクトを持つことは保証されていません(... and-forPの私をdownvoted)。このすべてを行う専用のルータを構築したほうがよいでしょう。 – Lostfields

関連する問題