2017-11-13 2 views
0

Ich bin neu in Typescript, also ertragen Sie mit mir.Erweitern express.Anfrage im Projekt

Ich arbeite an einem Express-basierten Web-Service. Ich möchte, dass ein Teil der frühen Middleware ein Logging-Objekt auf das Request-Objekt setzt und später im Request-Handler-Flow verwendet.

Die Middleware und der letzte Anforderungshandler sind in verschiedenen Dateien organisiert.

Was wäre die beste Möglichkeit, das express.Request-Objekt zentral zu erweitern, um die Verwendung dieses Logging-Objekts zu ermöglichen, ohne dass es Warntypen gibt?

Nur um zu zeigen, was ich habe und will:

Die Datei, die mein Log-Objekt Express- und setzt instanziiert:

const app = express(); 
const log = console; 

app.use((req: express.Request, res: express.Response, next: express.NextFunction) => { 
    req.log = log; 
    next(); 
}); 

Ein Request-Handler:

(req: express.Request, res: express.Response): void => { 
    req.log("request was made"); 
    res.send(); 
} 

Antwort

2

Sie die verlängern express.Request Objekt wie folgt:

declare global { 
    namespace Express { 
    interface Request { 
     log(...params: any[]): void 
    } 
    } 
} 

Oder, wenn Sie eine deutlichere Unterscheidung zwischen der Vanille Request Typ und Augmented-Version machen wollen, können Sie etwas tun könnte:

interface RequestWithLogging extends express.Request { 
    log(...params: any[]): void 
} 

app.get('/', (req: RequestWithLogging, res: express.Response) => { 
    req.log('Log something') 
    res.send('Hello World!') 
}) 
+0

Das ist genial! Und es kann in meinem Projekt in eine separate .d.ts-Datei gehen, so dass es nirgends verschmutzt. Ill testen Sie dies für eine Weile und sehen, ob es irgendwelche Fallstricke gibt. :) – ath88