我目前正在使用Express.js
和Typescript
制作一个Node.js
服务器。我有一个routes
文件夹,在其中创建了包含路由的.ts
文件。其中一个文件可能如下所示:
import { Router, Request, Response } from "express";
export const router: Router = Router();
router.get("/", (_: Request, res: Response) => {
res.json({
message: "Hello world",
});
});
export const path = "/users";
在我的主文件server.ts
中,我使用在路径中导出的变量动态添加所有路径。
// set __dirname
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const routesPath: string = path.join(__dirname, "routes");
// register routes
try {
fs.readdirSync(routesPath).forEach(async (file: string) => {
const route: { path: string; router: Router } = await import(
`./routes/${file}`
);
app.use(route.path, route.router);
});
// ! Causes Issue
app.all("*", (_: Request, res: Response) =>
res.status(404).json({
message: "Not found",
status: 404,
})
);
} catch (err) {
console.log(err);
}
在下面的*
路由中,我遇到了一个问题,当它被取消注解时,它会覆盖所有其他路由,但当我将它注解掉时,这些路由正常工作。可能是什么原因导致了这个问题?我还尝试在注册所有路由之前移动404
路由,但没有帮助。
2条答案
按热度按时间lstz6jyr1#
这个问题是因为循环块异步运行,即使您在
forEach
之后定义了app.all("*", ...)
,但它将在forEach
之前执行。因此,您需要更改
forEach
部分,如下所示:hc2pp10m2#
}