node.js - Express.js-rutter med Typescript


Jag vill använda Express.js med Typescript för att specificera koden mer modulärt/OO.

Jag vill implementera en Route/Controller genom att implementera IRoute-gränssnittet och sedan lägga till den nya Route i app.use().

Problemet jag står inför är att varje operation (get, post, put, delete) i sig returnerar IRoute-gränssnittet och jag är inte säker på vad jag ska returnera. Att returnera return <IRoute> this; i en operation fungerar inte.

TypeScript-kompilatorn svarar med följande felmeddelande:

Klassen MessurmentsController implementerar felaktigt gränssnittet IRoute. Typerna för egenskapen all är inkompatibla. Typen (req: Request, res: Response, next: Function) => void kan inte tilldelas typ (...handler: RequestHandler[]): IRoute. Typerna för parametrarna req och handler är inkompatibla. Typen Request kan inte tilldelas typen RequestHandler.

/// <reference path="../../../typings/tsd.d.ts" />

import {IRoute, Request,Response}  from 'express';


export class MeasurementsController implements IRoute {
	path: string;
	stack: any;
	
	constructor(){
		this.path = "/api/measurements"
	}
	
	
	all(req: Request, res: Response, next: Function){
		res.send('');
        //return <IRoute> this;
	}
	
	get(req: Request, res: Response, next: Function){
		res.send('');
	}
	
	post(req: Request, res: Response, next: Function){
		res.send('');
	}
	
	put(req: Request, res: Response, next: Function){
		res.send('');
	}
	
	delete(req: Request, res: Response, next: Function){
		res.send('');
	}
	patch(req: Request, res: Response, next: Function){
		res.send('');
	}
	options(req: Request, res: Response, next: Function){
		res.send('');
	}
	head(req: Request, res: Response, next: Function){
		res.send('');
	}
}

Rutten i d.ts definieras som

    module e {
        interface IRoute {
            path: string;
            stack: any;
            all(...handler: RequestHandler[]): IRoute;
            get(...handler: RequestHandler[]): IRoute;
            post(...handler: RequestHandler[]): IRoute;
            put(...handler: RequestHandler[]): IRoute;
            delete(...handler: RequestHandler[]): IRoute;
            patch(...handler: RequestHandler[]): IRoute;
            options(...handler: RequestHandler[]): IRoute;
            head(...handler: RequestHandler[]): IRoute;
        }

Någon aning om vad jag behöver returnera i en operation för att få detta att fungera?

Svar #1

Slutligen dök en lösning upp:

routing-controllers gör det möjligt att skapa kontrollklass med metoder som handlingar som hanterar förfrågningar. Du kan använda routing-controllers med express.js eller koa.js. https://github.com/pleerock/routing-controllers

Svar #2

Jag hoppas att detta kommer att hjälpa dig.

export class Admin implements IRoute {
    path: string;
    stack: any;
    constructor() {
        this.path = '/api/Admin';
    }

    all(handerl: RequestHandler): any {
        return <IRoute>this;
    }
    get(handerl: RequestHandler): any {
        return <IRoute>this;
    }
    post(handerl: RequestHandler): any {
        return <IRoute>this;
    }
    put(handerl: RequestHandler): any {
        return <IRoute>this;
    }
    delete(handerl: RequestHandler): any {
        return <IRoute>this;
    }
    patch(handerl: RequestHandler): any {
        return <IRoute>this;
    }
    options(handerl: RequestHandler): any {
        return <IRoute>this;
    }
    head(handerl: RequestHandler): any {
        return <IRoute>this;
    }
}

Relaterade artiklar