typescript 快速通配符路由覆盖其他路由

a6b3iqyw  于 2023-01-18  发布在  TypeScript
关注(0)|答案(2)|浏览(159)

我目前正在使用Express.jsTypescript制作一个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路由,但没有帮助。

lstz6jyr

lstz6jyr1#

这个问题是因为循环块异步运行,即使您在forEach之后定义了app.all("*", ...),但它将在forEach之前执行。
因此,您需要更改forEach部分,如下所示:

await Promise.all(fs.readdirSync(routesPath).map(async (file: string) => {
    const route: { path: string; router: Router } = await import(
        `./routes/${file}`
    );

    app.use(route.path, route.router);
}));

app.all("*", (_: Request, res: Response) =>
    res.status(404).json({
        message: "Not found",
        status: 404,
    })
);
hc2pp10m

hc2pp10m2#

async function registerRoutes() {
let files = fs.readdirSync(routesPath);
for (let i = 0; i < files.length; i++) {
  let file = files[i];
  const route = await import(`./routes/${file}`);

  app.use(route.path, route.router);
  console.log("register ");
}
console.log("final");
app.use("*", (_, res) =>
  res.status(404).json({
    message: "Not found",
    status: 404,
  })
);

}

相关问题