Express
创建服务器
js
// 1.导入 express
const express = require('express');
// 2.创建 web 服务器
const app = express();
// 4.启动 web 服务器
app.listen(80, ()=>{
console.log('express server running at http://127.0.0.1');
})
监听请求(路由)
js
// 以下代码在启动服务器前
// 3.监听客户端 GET 和 POST 请求,并向客户端相应具体内容
app.get('/user', (req, res) => {
res.send({ name: 'zs', age: 20, gender: '男' });
})
app.post('/user', (req, res) => {
res.send({ name: 'zs', age: 20, gender: '男' });
})
处理参数
js
// req.query可以获取静态参数
app.get('/user', (req, res) => {
// 访问http://127.0.0.1/user?name=zs&age=20
console.log(req.query.name);
console.log(req.query.age);
res.send(req.query);
})
// req.params可以获取动态参数
app.get('/user/:id', (req, res) => {
console.log(req.params); // {"id":"1"}
res.send(req.params) // {"id":"1"}
})
托管静态资源
js
// 将public文件夹作为静态资源文件夹
// 路径为:http://127.0.0.1
app.use(express.static('public'));
// 多次调用static可以托管多个文件夹
// 根据目录的添加顺序查找所需的文件
app.use(express.static('files'));
// 挂载路径前缀
// 路径为:http://127.0.0.1/public
app.use('/public', express.static('public'));
模块化路由
路由是指客户端的请求与服务器处理函数之间的映射关系。
Express中的路由分3部分组成,分别是请求的类型、请求的URL地址、处理函数,格式如下:app.METHOD(PATH, HANDLER)
js
// 创建模块化路由
// 1.导入Express
const express = require('express');
// 2.创建路由对象
const router = express.Router();
// 3.挂载具体的路由
router.get('/user/list', (req, res) => {
res.send('Get user list.');
})
router.post('/user/add', (req, res) => {
res.send('Add new user');
})
// 4.向外导出路由模块
module.exports = router;
// 导入模块化路由
// 1.导入路由模块
const router = require('./router.js')
// 2.注册路由模块
app.use(router);
// 挂载路径前缀
// 路径为:http://127.0.0.1/api
app.use('api', router);
跨域
使用cors是Express的一个第三方中间件。通过安装和配置cors中间件,可以解决跨域问题。
使用方法:
- 运行
npm install cors
安装中间件 - 使用
const cors = require('cors');
导入中间件 - 在路由之前调用
app.use(cors());
配置中间件
三个响应头
- Access-Control-Allow-Origin
- origin 参数的值指定了允许访问该资源的外域URL
res.setHeader('Access-Control-Allow-Origin','域名');
- Access-Control-Allow-Header
- 若客户端发送了额外的请求头,需要对该请求头进行声明
res.setHeader('Access-Control-Allow-Headers','Content-Type, X-Custom-Header');
- Access-Control-Allow-Methods
- 默认只支持GET、POST、HEAD请求,其它请求需声明
res.setHeader('Access-Control-Allow-Methods','PUT, DELETE');
请求分类
- 简单请求(以下两个条件都要满足)
- 请求方式:GET、POST、HEAD三者之一
- HTTP头部信息不超过9种字段
- 特点:客户端与服务器之间只会发生一次请求。
- 预检请求(以下条件满足其一即可)
- 请求方式为GET、POST、HEAD之外的请求Method类型
- 请求头包含自定义头部字段
- 向服务器发送了application/json格式的数据
- 特点:客户端与服务器之间会发生两次请求,OPTIONS预检请求成功之后,才会发起真正的请求。
JSONP接口
概念:浏览器端通过
<script>
标签的src属性,请求服务器上的数据,同时,服务器返回一个函数的调用。这种请求数据的方式叫做JSONP特点:
- JSONP不属于真正的AJAX请求,因为它没有使用XMLHttpRequest这个对象
- JSONP仅支持GET请求,不支持POST、PUT、DELETE等请求
js// 必须在配置cors中间件之前,配置JSONP接口 app.get('/api/jsonp', (req, res) => { // 1.得到函数的名称 const funcName = req.query.callback; // 2.定义要发送到客户端的数据对象 const data = { name: 'zs', age: 22 }; // 3.拼接出一个函数的调用 const scriptStr = `${funcName}(${JSON.stringify(data)})`; // 4.把拼接的字符串响应给客户端 res.send(scriptStr); })
Session(服务端渲染)
客户端第一次请求服务器的时候,服务器通过响应头的形式,向客户端发送一个 身份认证的Cookie,客户端会自动将Cookie保存在浏览器中。
当客户端浏览器每次请求服务器时,浏览器会自动将身份认证相关的Cookie,通过请求头的形式发送给服务器,服务器即可验明客户端的身份。
安装express-session:
npm i express-session
配置express-session
js// 1.导入session中间件 const session = require('express-session'); // 2.配置session中间件 app.use(session({ secret: 'lbviic', // 可以为任意字符串 resave: false, // 固定写法 saveUninitialized: true // 固定写法 }));
向session中存数据
jsapp.post('/api/login', (req, res) => { // 只有配置了express-session中间件后,才有req.session // 将登录成功后的用户信息,保存到Session req.session.user = req.body; req.session.isLogin = true; })
从session中取数据
jsapp.get('/api/username', (req, res) => { if (req.session.isLogin) { res.send({ status: 0, msg: '获取成功', username: req.session.user.username, }) } })
清空session:
req.session.destroy();
预览: