Express框架中的router对象是用来处理HTTP请求的一种方式,它可以帮助我们更加方便地组织代码,同时支持模块化开发和版本控制等功能。在本篇攻略中,我们将详细讲解Express框架中router对象的数据结构和使用方法。
路由基础
在开始讲解router对象之前,我们首先需要了解一些基本的路由知识。Express中的路由由一个或多个HTTP方法(比如GET、POST等)、一个路径和一个或多个处理函数组成。处理函数是一个中间件函数,用来处理请求和响应。
以下是一个简单的路由示例:
app.get('/users/:userId', function (req, res) {
res.send('userId: ' + req.params.userId);
});
该路由匹配以“/users/”开头的路径,同时要求路径中包含一个userId参数,比如“/users/123”。当访问这个路径时,处理函数将会返回“userId: 123”的响应。
router对象概述
router对象是Express中的一个中间件函数,我们可以将它看作是一个小型的应用程序,可以拥有自己的路由、中间件等。
下面是一个简单的router对象示例:
const express = require('express');
const router = express.Router();
router.get('/users/:userId', function (req, res) {
res.send('userId: ' + req.params.userId);
});
module.exports = router;
在上面的示例中,我们创建了一个名为router的对象,该对象包含一个以GET方法定义的路由。注意,我们使用了router.get()方法而不是app.get()方法。这是因为router对象只对应用程序范围内指定的路径和HTTP方法进行响应。
为了使用该router对象,我们需要在应用程序中进行引入:
const usersRouter = require('./usersRouter');
app.use('/users', usersRouter);
在上面的例子中,我们使用了app.use()方法,将该router对象挂载到了“/users”路径上。当访问“/users/:userId”这个路径时,该router对象将会处理该请求,并返回相应的响应。
router对象数据结构
router对象支持多个路由和规则的组合,我们可以使用router对象的多种方法来定义和操作这些路由。下面是一些常用的router对象方法:
- router.get(path, [callback...], callback)
- router.post(path, [callback...], callback)
- router.put(path, [callback...], callback)
- router.delete(path, [callback...], callback)
- router.use([path,] function [, function...])
- router.param([name,] callback)
- ...
其中,get、post、put和delete方法与前面的路由基础部分相同,可以用来定义相应的HTTP方法的路由。
use方法可以用来添加中间件或子路由,中间件是用来处理请求和响应的函数,子路由是一个具有全部HTTP方法的路由对象。
param方法用来在匹配路由之前处理指定参数,常用于参数校验或参数重命名。
下面是一个利用router对象构建简单API的示例代码:
const express = require('express');
const router = express.Router();
router.get('/users', function (req, res) {
// 返回所有用户信息
});
router.get('/users/:id', function (req, res) {
// 返回指定id的用户信息
});
router.post('/users', function (req, res) {
// 新增用户信息
});
router.patch('/users/:id', function (req, res) {
// 更新指定id的用户信息
});
router.delete('/users/:id', function (req, res) {
// 删除指定id的用户信息
});
module.exports = router;
在上面的代码中,我们创建了一个名为router的对象,并定义了多个路由。最后,我们通过module.exports将该对象导出,以便其他文件可以引入并使用它。
案例示例
下面是一个更加具体的案例示例:我们需要开发一个简单的API,用来展示电影和相关的信息。电影包含以下信息:电影名称、导演、演员、上映时间、简介等。我们需要使用Express框架来开发这个API,使用MySQL数据库来存储数据。
首先,我们需要创建一个名为moviesRouter的文件,用来存放我们的路由。在该文件中,我们需要编写以下代码:
const express = require('express');
const router = express.Router();
const mysql = require('mysql');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '123456',
database: 'movies_db'
});
router.get('/movies', function (req, res) {
connection.query('SELECT * FROM movies', function (error, results) {
if (error) {
console.log(error);
res.status(500).send('Internal Server Error');
} else {
res.send(results);
}
});
});
router.get('/movies/:id', function (req, res) {
const id = req.params.id;
connection.query('SELECT * FROM movies WHERE id = ?', [id], function (error, results) {
if (error) {
console.log(error);
res.status(500).send('Internal Server Error');
} else {
if (results.length === 0) {
res.status(404).send('Not Found');
} else {
res.send(results[0]);
}
}
});
});
router.post('/movies', function (req, res) {
const { name, director, actors, release_date, description } = req.body;
connection.query('INSERT INTO movies (name, director, actors, release_date, description) VALUES (?, ?, ?, ?, ?)', [name, director, actors, release_date, description], function (error, results) {
if (error) {
console.log(error);
res.status(500).send('Internal Server Error');
} else {
res.status(201).send('Created');
}
});
});
router.patch('/movies/:id', function (req, res) {
const id = req.params.id;
const { name, director, actors, release_date, description } = req.body;
connection.query('UPDATE movies SET name = ?, director = ?, actors = ?, release_date = ?, description = ? WHERE id = ?', [name, director, actors, release_date, description, id], function (error, results) {
if (error) {
console.log(error);
res.status(500).send('Internal Server Error');
} else {
if (results.affectedRows === 0) {
res.status(404).send('Not Found');
} else {
res.send('Updated');
}
}
});
});
router.delete('/movies/:id', function (req, res) {
const id = req.params.id;
connection.query('DELETE FROM movies WHERE id = ?', [id], function (error, results) {
if (error) {
console.log(error);
res.status(500).send('Internal Server Error');
} else {
if (results.affectedRows === 0) {
res.status(404).send('Not Found');
} else {
res.send('Deleted');
}
}
});
});
module.exports = router;
在上面的代码中,我们首先创建了一个名为connection的MySQL数据库连接。然后,我们编写了多个路由,用来处理电影的基本操作(如获取电影列表、获取指定电影的详细信息、新增电影等)。最后,我们将router对象通过module.exports导出。
在应用程序入口文件(如app.js或index.js)中,我们需要引入moviesRouter对象,并将它挂载到一个特定的路径(如“/api”)下。以下是示例代码:
const express = require('express');
const bodyParser = require('body-parser');
const moviesRouter = require('./moviesRouter');
const app = express();
app.use(bodyParser.json());
app.use('/api', moviesRouter);
app.listen(3000, function () {
console.log('Server started on port 3000');
});
在上面的代码中,我们首先引入moviesRouter对象,并通过app.use()方法将它挂载到了“/api”路径下。然后,我们启动了一个端口号为3000的服务器。
现在,我们就可以通过HTTP请求来访问我们的API了。例如,我们可以使用以下命令来获取电影列表:
curl http://localhost:3000/api/movies
当然,我们也可以使用其他工具(如Postman或Insomnia)来管理HTTP请求,并查看响应结果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Express框架中_router 对象数据结构使用详解 - Python技术站