Node.js 为什么在TypeScript中为express导入路由器不起作用
我正在尝试使用NodeJS和typescript设置一个简单的helloworldrest服务。我想把路由器分成不同的文件,但不知怎么的,它不起作用 简单地说,对于调用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";
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都不起作用。我真的被难住了/