Node.js 为什么在TypeScript中为express导入路由器不起作用

Node.js 为什么在TypeScript中为express导入路由器不起作用,node.js,typescript,express,Node.js,Typescript,Express,我正在尝试使用NodeJS和typescript设置一个简单的helloworldrest服务。我想把路由器分成不同的文件,但不知怎么的,它不起作用 简单地说,对于调用http://localhost:3000/welcome/hi,为什么项目1起作用,而项目2不起作用?我试图寻找教程,但代码似乎没有按照我希望的方式工作 项目1 import express from "express"; import { Router, Request, Response } from "express";

我正在尝试使用NodeJS和typescript设置一个简单的helloworldrest服务。我想把路由器分成不同的文件,但不知怎么的,它不起作用

简单地说,对于调用
http://localhost:3000/welcome/hi
,为什么项目1起作用,而项目2不起作用?我试图寻找教程,但代码似乎没有按照我希望的方式工作

项目1

import express from "express";
import { Router, Request, Response } from "express";

const app: express.Application = express();
const port: any = process.env.PORT || 3000;

const router: Router = Router();
const welcomeRouter: Router = Router();

welcomeRouter.get("/", (req: Request, res: Response) => {
    res.send({"message": "Welcome!"});
});

welcomeRouter.get("/:name", (req: Request, res: Response) => {
    let { name } = req.params;

    res.send(`Hello, ${name}!`);
});

router.get("/", (req: Request, res: Response) => {
    res.send({"message":"Hello, World!"});
});

app.use("/", router);
app.use("/welcome", welcomeRouter);


app.listen(port, () => {
    console.log(`Listening at http://localhost:${port}/`);
});
项目2

/app.ts

import { Router, Request, Response } from "express";

const router: Router = Router();

router.get("/", (req: Request, res: Response) => {
    res.send({"message": "Welcome!"});
});

router.get("/:name", (req: Request, res: Response) => {
    let { name } = req.params;

    res.send(`Hello, ${name}!`);
});

export default router;
import express from "express";
import { Router, Request, Response } from "express";

import welcomeRouter from "./app";

const app: express.Application = express();
const port: any = process.env.PORT || 3000;

const router: Router = Router();

app.use("/welcome", welcomeRouter);

router.get("/", (req: Request, res: Response) => {
    res.send({"message":"Hello, World!"});
});

app.use("/", router);
app.use("/welcome", welcomeRouter);

app.listen(port, () => {
    console.log(`Listening at http://localhost:${port}/`);
});
/server.ts

import { Router, Request, Response } from "express";

const router: Router = Router();

router.get("/", (req: Request, res: Response) => {
    res.send({"message": "Welcome!"});
});

router.get("/:name", (req: Request, res: Response) => {
    let { name } = req.params;

    res.send(`Hello, ${name}!`);
});

export default router;
import express from "express";
import { Router, Request, Response } from "express";

import welcomeRouter from "./app";

const app: express.Application = express();
const port: any = process.env.PORT || 3000;

const router: Router = Router();

app.use("/welcome", welcomeRouter);

router.get("/", (req: Request, res: Response) => {
    res.send({"message":"Hello, World!"});
});

app.use("/", router);
app.use("/welcome", welcomeRouter);

app.listen(port, () => {
    console.log(`Listening at http://localhost:${port}/`);
});
“装载”或
应用程序的顺序。使用每个路由器都很重要。此外,按照安装顺序,路径也很重要。把它们看作是一个整体

因此,对于第一个问题:

  • /welcome
    ->
    welcomeRouter
  • /
    ->
    路由器
  • 所以当你做
    GEThttp://localhost:3000/welcome/hi
    ,welcomeRouter
    将处理该请求,因为它是堆栈中匹配路径
    /welcome
    的第一个请求

    只做
    GEThttp://localhost:3000/welcome
    产生
    {“消息”:“欢迎!”}
    ,对吗?然后最后做一个
    GEThttp://localhost:3000/welcome/hi
    产生:
    你好

    对于第二个,您有:

  • /
    ->
    路由器
    (我猜此路由器指的是您在
    app.ts
    中定义的路由器)
  • /welcome
    ->
    welcomeRouter
  • 在导出
    路由器
    对象的
    app.ts
    中,有一条路由定义为
    /:name

    这将处理任何事情:
    /*
    。这意味着它还将处理
    /welcome
    ,其中
    welcome
    成为
    名称
    参数


    因此,将
    welcomeRouter
    移动到
    路由器上方,应该可以使其像项目1一样工作。

    嗨!谢谢你的评论。我听从了你的建议,改变了项目2中的顺序,把“/”放在“/”欢迎”之前,但没有用。为了确保这一点,我也确实更改了顺序,并发现在这两种情况下,在项目2中
    http://localhost:3000/welcome/hi
    不起作用,但
    http://localhost:3000/
    没有。无论哪一个app.use的顺序排在第一位,项目2都不起作用。我真的被难住了/