在 Express 中,我的路由目录中的 router.get('/') 如何处理除 '/' 以外的请求?

In Express, how does router.get('/') in my routes directory handle requests other than '/'?

在 app.js 我有:

const routes = './routes/'
const usersRouter = require(routes +'users');

/*more code*/

app.use('/users', usersRouter);

在users.js中,我有:

const express = require('express');
const router = express.Router();

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

module.exports = router;

我的问题:router.get('/') 如何知道获取用户文件?通常我需要将 '/users' 传递给 router.get(。但是 app.js 中的 app.use('/users',我只需要 users.js 中的 router.get('/')。事实上,如果我在 users.js 中键入 router.get('/users',程序就会中断。

Learning Express,我可以解释它是如何工作的。

当你这样做时:

app.use('/users', usersRouter);

这已经过滤为仅将以 /users 开头的请求发送到路由器。它还从路径的开头剥离 /users,因此路由器本身将在已从中剥离 /users 的简化路径上进行匹配,对于 /users 将只是 /.对于像 /users/something 这样的 URL,路由器将匹配 /something.

因此 router.get("/", ...) 将匹配 /users 的原始 URL,而不是 /users/something

app.use('/users', usersRouter);

将使用户路由器处理以 /users 为前缀的请求。因此,users 文件中的路由器处理的不是 /,而是 /users,因为您告诉您的应用程序为 /users/* 使用该特定路由器。实际上,这只是 router.get('/users') 的捷径。

您已将 usersRouter 注册为中间件,它将在请求 URI 以 /users 为前缀时执行,例如 https://localhost:3000/users/http://localhost:3000/users/subroute

// attach `usersRouter` as middleware
app.use('/users', usersRouter);

如果在您的 users.js 中定义了这样的路线

router.get('/', (req, res) => {});
router.post('/users', (req, res) => {});
router.get('/:userId', (req, res) => {});
router.delete('/:userId', (req, res) => {}); 

module.exports = router;

您将拥有此路线列表

  1. GET => http://localhost:3000/users
  2. POST => http://localhost:3000/users/users/
  3. GET => http://localhost:3000/users/1
  4. 删除 => http://localhost:3000/users/1

如果您尝试访问的请求 URI 是在您的 Express 应用程序中定义的,则处理程序将回退到 Express 构建 Error Handler

因此,如果您在 users.js 文件中定义了路由器 router.get('/users', ...),只要您尝试使用 http://...:../users/users.[=23 访问该路由器,应用程序就不会中断=]

Learn more about middleware Learn more about Express routing