Express 是一个基于 Node.js 的快速、非意见化的 Web 应用框架,广泛用于构建 API 和 Web 应用。Router
是 Express 中的一个核心组件,它允许你将路由逻辑模块化和组织化,从而提高代码的可维护性和扩展性。
本文将详细介绍如何使用 Express 的 Router
,并分享一些最佳实践。
Express Router 是 Express 提供的一种中间件,用于组织和管理应用中的路由。通过 Router
,你可以将不同功能模块的路由分离到不同的文件中,从而使代码更加清晰和易于维护。
首先,确保你已经安装了 Express:
npm install express
然后,在你的项目中初始化 Express:
// app.js
const express = require('express');
const app = express();
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
在没有使用 Router
的情况下,你可以直接在主文件中定义路由:
// app.js
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Home Page');
});
app.get('/about', (req, res) => {
res.send('About Page');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
这种方式适用于小型项目,但对于大型项目来说,代码会变得难以管理和维护。
为了使代码更清晰,我们可以使用 Router
将不同功能模块的路由分离到不同的文件中。
假设我们有一个用户模块,可以创建一个 users.js
文件来处理用户的路由:
// routes/users.js
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.send('User List');
});
router.get('/:id', (req, res) => {
const userId = req.params.id;
res.send(`User ID: ${userId}`);
});
module.exports = router;
在主文件 app.js
中引入并使用这个路由模块:
// app.js
const express = require('express');
const app = express();
const usersRouter = require('./routes/users');
app.use('/users', usersRouter);
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
现在,访问 /users
将返回用户列表,访问 /users/123
将返回用户ID为123的信息。
有时你可能需要嵌套路由。例如,你可能有一个博客模块,并且希望在其下再划分文章和评论的子路由。
// routes/blog/articles.js
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.send('Article List');
});
router.get('/:id', (req, res) => {
const articleId = req.params.id;
res.send(`Article ID: ${articleId}`);
});
module.exports = router;
// routes/blog/comments.js
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.send('Comment List');
});
router.get('/:id', (req, res) => {
const commentId = req.params.id;
res.send(`Comment ID: ${commentId}`);
});
module.exports = router;
在 blog.js
中组合这些子路由:
// routes/blog.js
const express = require('express');
const router = express.Router();
const articlesRouter = require('./articles');
const commentsRouter = require('./comments');
router.use('/articles', articlesRouter);
router.use('/comments', commentsRouter);
module.exports = router;
// app.js
const express = require('express');
const app = express();
const blogRouter = require('./routes/blog');
app.use('/blog', blogRouter);
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
现在,访问 /blog/articles
和 /blog/comments
将分别调用相应的子路由。
Router
支持使用中间件来处理请求前后的逻辑。你可以在路由定义之前或之后添加中间件。
// app.js
const express = require('express');
const app = express();
app.use((req, res, next) => {
console.log('Global Middleware');
next();
});
app.get('/', (req, res) => {
res.send('Home Page');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
你也可以在特定的 Router
中使用中间件:
// routes/users.js
const express = require('express');
const router = express.Router();
router.use((req, res, next) => {
console.log('Users Middleware');
next();
});
router.get('/', (req, res) => {
res.send('User List');
});
module.exports = router;
Express 提供了一种简单的方式来处理错误。你可以在路由处理函数中抛出错误,并在全局错误处理器中捕获它们。
// routes/users.js
const express = require('express');
const router = express.Router();
router.get('/:id', (req, res, next) => {
const userId = req.params.id;
if (!isValidUserId(userId)) {
return next(new Error('Invalid User ID'));
}
res.send(`User ID: ${userId}`);
});
module.exports = router;
在主文件中添加错误处理器:
// app.js
const express = require('express');
const app = express();
const usersRouter = require('./routes/users');
app.use('/users', usersRouter);
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something broke!');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});