node.js - Typescript & Express - Η δρομολόγηση δεν λειτουργεί


Ακολουθώ το σεμινάριο εδώ για να ρυθμίσω μια απλή εφαρμογή express-typescript. Αλλά για κάποιο λόγο, οι δρομολογήσεις μου δεν λειτουργούν όπως αναμένονταν. Βλέπω αρκετές ερωτήσεις για αυτό το θέμα, αλλά τίποτα που να ταιριάζει ακριβώς με το πρόβλημά μου. Συνεπώς, ζητώ συγγνώμη αν αυτό έχει ήδη ερωτηθεί και απαντηθεί.

app.ts

import express from 'express';
import bodyParser from 'body-parser';
import ngrok from 'ngrok'
import IController from './controller.interface'
import SessionController from './sessions/sessions.controller'
 
class App {
  public app: express.Application;
  public port: number;
 
  constructor(controllers: IController[], port: number) {
    this.app = express();
    this.port = port;
 
    this.initializeMiddlewares();
    this.initializeControllers(controllers);
  }
 
  private initializeMiddlewares() {
    this.app.use(bodyParser.json());
  }
 
  private initializeControllers(controllers: IController[]) {
    controllers.forEach((controller) => {
      console.log(controller.path);
      console.log(controller.router);
      this.app.use(controller.path, controller.router);
    });
  }
 
  public listen() {
    this.app.listen(this.port, () => {
      console.log(`App listening on the port ${this.port}`);
      ngrok.connect({proto: 'http', addr: this.port});
    });
  }
}
 
export default App;

controller.interface.ts

import * as express from 'express';
 
interface IController {
  path: string,
  router: express.Router
}
 
export default Controller;

διακομιστής.ts

import App from './app';
import SessionController from './sessions/sessions.controller';
 
const app = new App(
  [
    new SessionController()
  ],
  3999
);
 
app.listen();

συνεδρίες/session.interface.ts

interface Session {
  sessionId: string;
}
 
export default Session;

συνεδρίες/sessions.controller.ts

import * as express from 'express';
import Session from './session.interface';
import IController from '../controller.interface'
 
class SessionController implements IController{
  public path = '/sessions';
  public router = express.Router();
 
  private session: Session =
    {
      sessionId: "ABCD12345"
    };
 
  constructor() {
    this.intializeRoutes();
  }
 
  public intializeRoutes() {
    console.log("Route initialised");
    this.router.get(this.path, this.getSession);
  }

  getSession = (request: express.Request, response: express.Response) => {
    console.log("Get session call");
    response.send(this.session);
  }
}
 
export default SessionController;

Έξοδος

[nodemon] 2.0.12
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: ts,json
[nodemon] starting `ts-node src/server.ts`
Route initialised
/sessions
[Function: router] {
  params: {},
  _params: [],
  caseSensitive: undefined,
  mergeParams: undefined,
  strict: undefined,
  stack: [
    Layer {
      handle: [Function: bound dispatch],
      name: 'bound dispatch',
      params: undefined,
      path: undefined,
      keys: [],
      regexp: /^\/sessions\/?$/i,
      route: [Route]
    }
  ]
}
App listening on the port 3999

Κανένα άλλο σφάλμα, δήλωση καταγραφής ή προειδοποίηση.

Αλλά GET http://localhost:3999/sessions

Δεν καλεί τη μέθοδο getSession και βλέπω ένα μήνυμα Cannot GET /sessions στην οθόνη.

Απάντηση #1

Φαίνεται ότι καταχωρίσατε τον δρομολογητή ως /sessions καθώς και τη διαδρομή GET μέσα σε αυτόν χρησιμοποιώντας την ίδια ιδιότητα path. Έτσι υποψιάζομαι ότι σε αυτή τη διαμόρφωση θα λάβετε σωστή απάντηση χρησιμοποιώντας

GET http://localhost:3999/sessions/sessions

Δείξτε / είτε κατά την εγγραφή ολόκληρου του δρομολογητή είτε κατά την εγγραφή του this.router.get