Skip to content
Netflix - 每月低至 25 元

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中间件,可以解决跨域问题。

使用方法:

  1. 运行 npm install cors 安装中间件
  2. 使用 const cors = require('cors'); 导入中间件
  3. 路由之前调用 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中存数据

    js
    app.post('/api/login', (req, res) => {
        // 只有配置了express-session中间件后,才有req.session
        // 将登录成功后的用户信息,保存到Session
        req.session.user = req.body;
        req.session.isLogin = true;
    })
  • 从session中取数据

    js
    app.get('/api/username', (req, res) => {
        if (req.session.isLogin) {
            res.send({
                status: 0,
                msg: '获取成功',
                username: req.session.user.username,
            })
        }
    })
  • 清空session:req.session.destroy();

关注微信公众号搬瓦工 - 美国 CN2 优化线路
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0

预览:

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3