【问题标题】:Typescript & Express - Routing not working打字稿和快递 - 路由不起作用
【发布时间】:2021-10-28 07:57:54
【问题描述】:

我正在按照教程 here 设置一个简单的 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;

server.ts

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

sessions/session.interface.ts

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

sessions/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 消息。

【问题讨论】:

    标签: node.js typescript express


    【解决方案1】:

    您似乎将路由器注册为/sessions,并使用相同的path 属性在其中注册了GET 路由。所以我怀疑在这个配置中你会得到一个正确的响应使用

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

    在注册整个路由器或注册this.router.get时指明/

    【讨论】:

    • 谢谢。我昨晚想通了,正如你所提到的,我已将路由器 get 方法更改为 /,它就像一个魅力。
    猜你喜欢
    • 2020-08-12
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2018-09-29
    • 2018-04-10
    • 2020-03-18
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多