nodejs express 路由器没有收到对 /mypage.html 的请求

nodejs express router doesn't catch get request to /mypage.html

我的目标是

  1. 当用户进入特定页面时向我的控制台打印一条消息

  2. 无需编写 .html 扩展名即可访问页面。

如果我使用以下内容,其中 test.html 不是现有页面,我会看到 当用户尝试访问 /test/test.html 页面时,控制台中的预期消息。

router.get(/^\/test(\.html)?$/, async (req, res) => {
    console.log('User trying to access test.html page')
    res.send('welcome to test page')
})

但如果我对现有页面执行相同操作 (/dashboard.html)

router.get(/^\/dashboard(\.html)?$/, async (req, res) => {
     console.log('User trying to access dashboard.html page')
     res.send('welcome to dashboard page')
})

当用户尝试访问 /dashboard 时,我会在我的控制台中看到预期的消息,但当他尝试访问 /dashboard.html 时,页面将只是加载而不会在我的控制台中看到任何消息。 为什么会这样?

我认为问题在于您在告诉您的应用程序使用您的路由器之前告诉您的应用程序使用静态文件。

我的意思是,如果您这样做(假设我们在 public 文件夹中有 dashboard.html 文件):

const express = require("express");
const app = express();
const router = express.Router();
const port = 3000;

router.get(/^\/test(\.html)?$/, async (req, res) => {
  console.log("User trying to access test.html page");
  res.send("welcome to test page");
});

router.get(/^\/dashboard(\.html)?$/, async (req, res) => {
  console.log("User trying to access dashboard.html page");
  res.send("welcome to dashboard page");
});

app.use("/", router);

app.use(express.static("public"));

app.listen(port, () => console.log(`Example app listening on port ${port}!`));

它应该会如您所愿。

但是您似乎将 app.use(express.static...) 放在 app.use 路由器之前。像这样:

const express = require("express");
const app = express();
const router = express.Router();
const port = 3000;

app.use(express.static("public"));

router.get(/^\/test(\.html)?$/, async (req, res) => {
  console.log("User trying to access test.html page");
  res.send("welcome to test page");
});

router.get(/^\/dashboard(\.html)?$/, async (req, res) => {
  console.log("User trying to access dashboard.html page");
  res.send("welcome to dashboard page");
});

app.use("/", router);


app.listen(port, () => console.log(`Example app listening on port ${port}!`));

因此,在这种情况下,当您键入 dashboard.html 的确切路径时,它不会使用路由器来解析内容,而只会从 public 文件夹中获取它。

这只是代码中 app.uses(...) 的顺序问题