nodejs day5

今日授课内容

  1. Buffer 类型介绍
  2. express 介绍
  • express 介绍
  • express 实现 hello world
  • express 脚手架
  • express 简单路由
  • express 正则表达式路由
    • /^\/index(\/.+)?$/
  • express 处理静态资源
  • express 中的 res.send() 和 res.end() 区别
  • res.json()等价于 res.send(json)、res.sendFile()、res.redirect()、res.status(code).end()
  • app.use()、app.get()、app.all()区别
  • 中间件介绍
  1. ejs 模板引擎介绍

一、Buffer

思考:Buffer 类型产生的原因?主要用来解决什么问题?

看一下什么是 Buffer? 什么是 Stream?

一、类型介绍

  1. JavaScript 语言没有读取或操作二进制数据流的机制。
  2. Node.js 中引入了 Buffer 类型使我们可以操作 TCP 流 或 文件流。
  3. Buffer 类型的对象类似于整数数组,但 Buffer 的大小是固定的、且在 V8 堆外分配物理内存。 Buffer 的大小在被创建时确定,且无法调整。( buf.length 是固定的,不允许修改 )
  4. Buffer 是全局的,所以使用的时候无需 require() 的方式来加载

二、如何创建一个 Buffer 对象

常见的 API 介绍

1. 创建一个 Buffer 对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 1. 通过 Buffer.from() 创建一个 Buffer 对象

// 1.1 通过一个字节数组来创建一个 Buffer 对象
var array = [
0x68,
0x65,
0x6c,
0x6c,
0x6f,
0x20,
0xe4,
0xb8,
0x96,
0xe7,
0x95,
0x8c
];
var buf = Buffer.from(array);
console.log(buf.toString("utf8"));

// 1.2 通过字符串来创建一个 Buffer 对象
// Buffer.from(string[, encoding])
var buf = Buffer.from("你好世界! Hello World!~");
console.log(buf);
console.log(buf.toString());

2. 拼接多个 Buffer 对象为一个对象

1
2
3
// Buffer.concat(list[, totalLength])
var bufferList = [];
var buf = Buffer.concat(bufferList);

3. 获取字符串对应的字节个数

1
2
3
4
// Buffer.byteLength(string[, encoding])

var len = Buffer.byteLength("你好世界Hello", "utf8");
console.log(len);

4. 判断一个对象是否是 Buffer 类型对象

1
2
3
4
// Buffer.isBuffer(obj)
// obj <Object>
// Returns: <boolean>
// Returns true if obj is a Buffer, false otherwise.

5. 获取 Buffer 中的某个字节

1
2
// 根据索引获取 Buffer 中的某个字节(byte、octet)
// buf[index]

6、获取 Buffer 对象中的字节的个数

1
2
// buf.length
// 注意:length 属性不可修改

7. 已过时的 API

1
2
3
4
5
6
// 以下 API 已全部过时
new Buffer(array)
new Buffer(buffer)
new Buffer(arrayBuffer[, byteOffset [, length]])
new Buffer(size)
new Buffer(string[, encoding])

三、Buffer 对象与编码

Node.js 目前支持的编码如下:

  1. ascii
  2. utf8
  3. utf16le
  • ucs2 是 utf16le 的别名
  1. base64
  2. latin1
  • binary 是 latin1 的别名
  1. hex
  • 用两位 16 进制来表示每个字节

示例代码:

1
2
3
4
5
var buf = Buffer.from("你好世界,Hello World!", "utf8");

console.log(buf.toString("hex"));
console.log(buf.toString("base64"));
console.log(buf.toString("utf8"));

四、思考:为什么会有 Buffer 类型?

  1. Buffer 使用来临时存储一些数据(二进制数据)
  2. 当我们要把一大块数据从一个地方传输到另外一个地方的时候可以通过 Buffer 对象进行传输
  3. 通过 Buffer 每次可以传输小部分数据,直到所有数据都传输完毕。

五、补充

  1. Stream

  2. Writable Stream

  • 允许 node.js 写数据到流中
  1. Readable Stream
  • 允许 node.js 从流中读取数据

二、express 介绍

  • 什么是 express ?

    • 基于 Node.js 平台开发的 “web 开发框架” ,就是一个 node.js 模块
    • express 的作用:它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。
    • express 同时也是 Node.js 的一个模块
  • 为什么学习 express 框架?

    • 为了让我们基于 Node.js 开发 web 应用程序更高效。

express 特点

  1. 实现了路由功能
  2. 中间件(函数)功能
  3. 对 req 和 res 对象的扩展
  4. 可以集成其他模板引擎

express 基本使用

  • 安装 express

    • npm 搜索,安装。按照文档一步一步进行
      1. 创建 package.json 文件
      2. 安装 express 模块:npm install express --save
  • 演示 Hello World 案例

    • 在 express 中,request 对象 和 response 对象一样使用,同时这两个对象还额外添加了其他的好用功能
    • res.send() 是 res.end()的扩展
    • 步骤总结:
      1、加载 express 模块
      2、创建 express 实例(一般叫 app )
      3、设计路由
      4、启动监听服务
  • 补充知识:

  • 使用 express 框架模拟 Apache 服务器处理静态资源

    • 主要使用到的方法express.static('public')

      • express.static('public')的返回值就是一个函数,这个函数的作用就是根据请求,读取静态资源文件并响应给用户
      • 注意:static() 方法参数路径要写 绝对路径,不要写相对路径。相对路径还是相对执行 node 命令的路径
    • 主要使用到的方法 app.use()

      • use()方法的参数 1 表示”虚拟路径”,参数 2 表示要开放的静态资源目录
    • 如何向客户端发送单个静态文件

      • res.sendFile() 方法
    • 托管静态资源时的两个注意点:

    1
    2
    3
    4
    5
    6
    7
    // 问题一(提问、演示)、
    app.use(express.static("./public"));
    app.use(express.static("./file"));

    // 问题二(提问、演示)、
    app.use("/aaa", express.static("./public"));
    app.use("/bbb", express.static("./public"));

带同学们看一下 express 文档中关于各种设置路由的方法

介绍一下 express 中的中间件

  • 中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object (res)), 和 web 应用中处于请求-响应循环流程中的中间件,一般被命名为 next 的变量。

  • 常规中间件(应用级中间件)的回调函数,一般有 3 个参数

    • req, res, next
    • 其中 next()是一个函数,通过这个函数把执行流程交给下一个中间件
  • 可以挂在中间件的部分方法

    • app.use()
    • app.get()、app.post()、app.put()、app.delete()、…等各种请求方法
    • 注意:在挂载中间件时 next() 方法的重要性,不调用该方法无法执行到下一个中间件
  • 中间件的应用场景

    • 利用中间件实现记录日志功能
    • 利用中间件模拟 body-parser 功能

介绍在 express 中如何使用模板引擎

  • 在 express 中, res 对象是具有 redner 方法的,但是需要自己配置一个模板引擎
  • 在 express 中渲染单个文件,使用 res.sendFile
  • res.render()要在设置好模板引擎后再使用

ejs 模板引擎介绍

  • 打开 npm 搜索 ejs
  • 打开 GitHub 的 ejs 地址,查看如何使用
  • ejs 模板引擎介绍
  • ejs 使用
    • ejs.render(str, data, options);

在 express 中配置使用 ejs 模板引擎

  • npm install ejs –save
  • 通过 app.set(‘views’, ‘路径’); 和 app.set(‘view engine’, ‘模板引擎名称’);来配置模板引擎
  • 配置好后就可以通过 res.render(‘a.ejs’, {})来渲染模板了

express 中的 request 对象的成员:

http://www.expressjs.com.cn/4x/api.html#req

express 中的 response 对象的成员:

http://www.expressjs.com.cn/4x/api.html#res

express 中的 ‘中间件’ 含义。

模板引擎后缀替换

  • app.engine(‘.ejs’, require(‘ejs’).renderFile)
  • app.set(‘view engine’, ‘ejs’)

通过使用 express 框架改造 Hacker News 网站

  • 把 resources、views、list.json 拷贝到该目录下,其他暂时不需要了
  • 创建 app.js
  • 创建 package.json
  • 安装 express
  • 提取 router.js 模块
  • 拷贝 handler.js 模块
  • handler.js 模块中获取 post 提交数据时,可以使用 body-parser 模块实现
    • npm 安装 body-parser
    • 在 express 中通过 app.use()挂载 body-parser 中间件,实现效果
  • 在 express 中无需 url 模块,直接可以通过 req.query 获取查询字符串对象

三、其他

1、ejs 模板引擎

  • ejs 模板引擎介绍
  • 打开 npm 搜索 ejs
  • 打开 GitHub 的 ejs 地址,查看如何使用
  • 演示 ejs 模板引擎的使用

2、介绍在 express 中如何使用模板引擎

  • 在 express 中, res 对象是具有 redner 方法的,但是需要自己配置一个模板引擎
  • 在 express 中渲染单个文件,使用 res.sendFile
  • res.render()要在设置好模板引擎后再使用
  • npm install ejs –save
  • 通过 app.set(‘views’, ‘路径’); 和 app.set(‘view engine’, ‘模板引擎名称’);来配置模板引擎
  • 配置好后就可以通过 res.render(‘a.ejs’, {})来渲染模板了

3、模板引擎后缀替换、

4、完成 hacker news 网站使用 express 改造

5、body-parser 使用

  • npm install
  • 在模块中 require(‘body-parser’)
  • 在 express 中配置
1
2
3
4
5
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }));

// parse application/json
app.use(bodyParser.json());
1. res.send() 方法
- 参数可以是字符串、Buffer对象、数组(json对象)、普通对象
- 通过调用该方法进行响应的时候,会自动添加一些响应头(Content-Type、Content-Length等)
-------------本文结束感谢您的阅读-------------
0%