一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情。
express
Express 是一个第三方模块,用于快速搭建服务器。它是一个基于 Node.js 平台,快速、开放、极简的 web 开发框架。
express保留了http模块的基本API,使用express的时候,也能使用http的API, 它还额外封装了一些新方法,能让我们更方便的搭建服务器。
构造Web服务器
使用Express构建Web服务器步骤有以下四步:
- 加载 express 模块
- 创建 express 服务器
- 开启服务器
- 监听浏览器请求并进行处理
// 使用express 搭建web服务器
// 1) 加载 express 模块
const express = require('express');
// 2) 创建 express 服务器
const app = express();
// 3) 开启服务器
app.listen(3006, () => console.log('express服务器开始工作了'));
// 4) 监听浏览器请求并进行处理
app.get('GET请求的地址', 处理函数);
app.post('POST请求的地址', 处理函数);
express方法
express之所以能够实现web服务器的搭建,是因为其内部对核心模块http进行了封装。封装之后,express提供了非常方便好用的方法。在express中,我们仍然可以使用http模块中的方法
-
express
- express.static() -- 开放静态资源
- express.urlencoded() -- 获取POST请求体
- 其他...
-
app
app.get()-- 处理客户端的GET请求app.post()-- 处理客户端的POST请求- app.use() -- 设置应用级别的配置
- 其他...
-
req
- req.body -- 获取POST请求体
- req.params -- 获取GET请求动态参数
- req.query -- 获取GET请求参数(获取查询字符串参数)
- 其他...
-
res
res.sendFile(文件的绝对路径)-- 读取文件,并将结果响应res.set({name, value})-- 设置响应头res.status(200)-- 设置响应状态码res.send(字符串或对象)-- 响应结果res.json(对象)-- 以JSON格式响应结果- res.jsonp() -- 以JSONP格式响应结果
const express = require('express');
const app = express();
app.listen(3006, () => console.log('启动了'));
app.get('/test', (req, res) => {
// express提供的新方法:res.send(); -- 做出响应,参数是响应体
// res.send('hello,我是服务器'); // 会自动设置响应头
// res.end(["aaa", "bbb", "ccc"]); // 报错,end方法,只能填字符串参数
// res.send(["aaa", "bbb", "ccc"]); // 对于数组、对象等,会自动JSON.stringify()
// express提供的新方法:sendFile(); -- 参数是一个文件(绝对)路径,会自动读取文件的内容,做出响应
// res.sendFile(path.join(__dirname, 'books.json'));
// express提供的新方法:res.json() -- 专门用于响应json数组的方法
// res.json({
// status: 0,
// message: '添加成功'
// });
// express提供的新方法:res.set() -- 设置响应头一样,不能设置状态码
res.set({
'Author': 'zhangsan'
});
res.send('看看响应头');
});
get接口
app.get('*', (req, res) => {}) 他能够匹配到所有的GET请求,所以把它放到所有接口的最后。
// app.get('请求的URL', callback);
app.get('/api/getbooks', (req, res) => {
// 处理GET方式的/api/getbooks接口
});
app.get('/', (req, res) => {
// 客户端没有指定请求的url,在这里处理。
});
app.get('*', (req, res) => {
// 处理所有的GET请求
})
POST接口
// app.post('请求的URL', callback);
app.post('/api/addbook', (req, res) => {
// 处理POST方式的/api/addbook接口
});
app.post('*', (req, res) => {
// 处理所有的POST请求
})
路由
在 Express 中,路由指的是客户端的请求与服务器处理函数之间的映射关系。Express 中的路由分 3 部分组成,分别是请求的类型、请求的 URL 地址、处理函数,格式如下:
// 路径 ,就是我们之前说的接口的处理程序
app.get('/api/getbooks', (req, res) => {
});
app.post('/api/getbooks', (req, res) => {
});
app.post('/api/addbook', (req, res) => {
});
每当一个请求到达服务器之后,需要先经过路由的匹配,只有匹配成功之后,才会调用对应的处理函数。
在匹配时,会按照路由的顺序进行匹配,如果请求类型和请求的 URL 同时匹配成功,则 Express 会将这次请求,转 交给对应的 function 函数进行处理。
为了方便对路由进行模块化的管理,Express 不建议将路由直接挂载到 app 上,而是推荐将路由抽离为单独的模块。 将路由抽离为单独模块的步骤如下:
-
创建路由模块对应的 .js 文件
- 创建router/login.js 存放 登录、注册、验证码三个路由
- 创建router/heroes.js 存放 和英雄相关的所有路由
-
调用 express.Router() 函数创建路由对象
const express = require('express');
const router = express.Router();
- 向路由对象上挂载具体的路由
// 把app换成router,比如
router.get('/xxx/xxx', (req, res) => {});
router.post('/xxx/xxx', (req, res) => {});
- 使用 module.exports 向外共享路由对象
module.exports = router;
- 使用 app.use() 函数注册路由模块 -- app.js
// app.js 中,将路由导入,注册路由
const login = require('./router/login.js');
app.use(login)
// app.use(require('./router/heroes.js'));
app.use( require(path.join(__dirname, 'router', 'heores.js')) );