针对“nodejs express路由匹配控制及Router模块化使用详解”的完整攻略,我会分为以下几个方面进行详细说明:
- 路由匹配控制
- Router模块化使用
- 示例说明
1. 路由匹配控制
在Node.js的Express框架中,路由控制是指将请求映射到指定的路由处理函数(controller)上。
主要通过app对象的路由apr()方法将处理方法与路由匹配。
app.get('/', (req, res) => {
res.send('Hello World!')
})
上述代码表示当访问网站根目录时,返回'Hello World!'
除了app.get()方法还有其他的请求方法,如app.post()、app.delete()、app.put()等。
在上述例子中,'/'是路由路径,(req, res) => {...}是路由处理函数。
路由路径可以是字符串、字符串模式、正则表达式,例如:
app.get('/about', (req, res) => {
res.send('About Page')
})
app.get('/users/:id', (req, res) => {
const id = req.params.id
res.send(`User ${id}`)
})
app.get(/.*fly$/, (req, res) => {
res.send('I am a butterfly')
})
2. Router模块化使用
在Express中,Route是指将相同前缀的路由放在一个Route对象下,来增加代码的可读性和维护性。在Route对象中,可以设置路由路径和路由处理函数。
要使用Route,需要通过Express.Router()创建一个Router实例,然后通过app.use()将路由器分配到特定路径上。
const express = require('express')
const app = express()
const router = express.Router()
router.get('/', (req, res) => {
res.send('Home Page')
})
router.get('/about', (req, res) => {
res.send('About Page')
})
router.get('/contact', (req, res) => {
res.send('Contact Page')
})
app.use('/pages', router)
app.listen(3000, () => console.log('Server running on port 3000))
上述例子表示:
- 创建了一个包含三个路由的Router实例,路由包含:'/'、'/about'、'/contact'
- 通过app.use('/pages', router),将路由器分配到'/pages'路径下
- 所有的'/pages'路由都指向Router实例
3. 示例说明
接下来,我通过两个示例来详细讲解一下路由匹配控制和Router模块化使用。
示例一
实现一个简单的博客系统,包含以下功能:
- 首页(/):显示所有博客文章的列表
- 博客文章详情页(/posts/:postId):显示对应postId的博客文章详情
- 发布新博客(/posts/new):渲染一个包含表单的页面,用户可以填写博客文章的内容
- 提交新博客(/posts):接收表单提交的数据,将博客文章保存在数据库中
首先,我们需要安装一些需要用到的依赖:
npm install express --save
npm install body-parser --save
npm install pug --save
npm install mongoose --save
接下来,创建一个文件夹,命名为blog,并在其中创建以下文件:
app.js // express 主文件
controllers // 注册控制器
|-- post.js
|-- home.js
middleware // 中间件
models // 注册数据库模型
routes // 注册路由
views // 视图
|-- home.pug
|-- post.pug
|-- new_post.pug
app.js主文件内容如下:
const express = require('express')
const bodyParser = require('body-parser')
const mongoose = require('mongoose')
const app = express()
mongoose.Promise = global.Promise
mongoose.connect('mongodb://localhost:27017/blog', {
useNewUrlParser: true,
useUnifiedTopology: true
})
app.set('views', './views')
app.set('view engine', 'pug')
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))
app.use('/', require('./routes/home'))
app.use('/posts', require('./routes/post'))
app.listen(3000, () => {
console.log('Server is running at http://localhost:3000')
})
home.js路由控制器内容如下:
const express = require('express')
const router = express.Router()
const Post = require('../models/post')
router.get('/', async (req, res) => {
const posts = await Post.find().exec();
res.render('home', {title: 'Home - Blog', posts: posts})
})
module.exports = router
post.js路由控制器内容如下:
const express = require('express')
const router = express.Router()
const Post = require('../models/post')
router.get('/:id', async (req, res) => {
const post = await Post.findById(req.params.id).exec()
res.render('post', {title: 'Post - Blog', post: post})
})
router.get('/new', (req, res) => {
res.render('new_post', {title: 'New Post - Blog'})
})
router.post('/', async (req, res) => {
const post = new Post({
title: req.body.title,
content: req.body.content
})
await post.save()
res.redirect('/')
})
module.exports = router
home.pug内容如下:
html
head
title= title
body
h1= title
a(href="/posts/new") Add New Post
ul
each post in posts
li
a(href="/posts/#{post.id}") #{post.title}
post.pug内容如下:
html
head
title= title
body
h1= post.title
p= post.content
new_post.pug内容如下:
html
head
title= title
body
h1 New Post
form(method='POST', action='/posts')
label Title
br
input(type='text', name='title', required)
br
label Content
br
textarea(name='content', required)
br
button(type='submit') Create Post
示例二
实现一个基于Router模块化开发的REST API,包含以下功能:
- 获取用户列表:GET /api/v1/users
- 获取指定用户信息:GET /api/v1/users/:id
- 创建新用户:POST /api/v1/users
- 更新指定用户信息:PUT /api/v1/users/:id
- 删除指定用户:DELETE /api/v1/users/:id
首先,我们需要安装一些需要用到的依赖:
npm install express --save
npm install body-parser --save
接下来,创建一个文件,命名为index.js,主要内容如下:
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
const usersRouter = require('./routes/users');
app.use('/api/v1/users', usersRouter);
app.listen(3000, () => console.log('App is running at http://localhost:3000'))
接下来,再创建一个文件夹,命名为routes,并在其中创建一个文件users.js,主要内容如下:
const express = require('express');
const router = express.Router();
const users = [
{id:1, name: 'Tom', age: 18},
{id:2, name: 'Jerry', age: 20},
{id:3, name: 'Bob', age: 22}
]
router.get('/', (req, res) => {
res.json(users)
})
router.get('/:id', (req, res) => {
const id = Number(req.params.id);
const user = users.find(user => user.id === id);
if (user) {
res.json(user)
} else {
res.status(404).json({ message: `User ${id} not found` });
}
})
router.post('/', (req, res) => {
const { name, age } = req.body;
const newUserId = users.length + 1;
const newUser = { id: newUserId, name, age };
users.push(newUser);
res.status(201).json(newUser)
})
router.put('/:id', (req, res) => {
const id = Number(req.params.id);
const user = users.find(user => user.id === id);
if (user) {
user.name = req.body.name;
user.age = req.body.age;
res.json(user);
} else {
res.status(404).json({ message: `User ${id} not found` });
}
})
router.delete('/:id', (req, res) => {
const id = Number(req.params.id);
const userIndex = users.findIndex(user => user.id === id);
if (userIndex !== -1) {
users.splice(userIndex, 1);
res.status(204).end();
} else {
res.status(404).json({ message: `User ${id} not found` });
}
})
module.exports = router;
总结
通过本文的介绍,希望你能够了解完整的“nodejs express路由匹配控制及Router模块化使用详解”的攻略,掌握路由匹配控制和Router模块化使用的基本原理和实际应用。对于以上两个示例,你可以通过命令行运行,然后访问相应的路径体验一下。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nodejs express路由匹配控制及Router模块化使用详解 - Python技术站