Node.js(二)

Node.js第二天

一、http模块介绍

1、服务器和客户端的概念回顾

​ 客户端负责向服务器发送请求, 获取数据并进行使用;

服务器负责接收来自客户端的网络请求, 处理数据并进行返回

2、http 内置模块

提供了创建 Web 服务器和客户端的相关 API

3、使用 Node 创建服务器的优势

无需安装和配置复杂的后台环境, 只需要几行代码就可以开启一个服务器, 十分精巧

二、服务器相关概念

1、IP 地址

用来标识互联网上一台计算机的唯一地址编号, 只有访问正确的 IP 地址才能和计算机进行数据通信

2、IP 地址格式

采用 “点分十进制” 表示成 A.B.C.D 的形式, 就是用4个从0~255的数字,来表示一个IP地址, 比如:

我们在终端输入 ipconfig 可以查看本机的 IPv4 地址格式

3、了解 ping 命令

在终端执行 ping 域名, 可以获取当前域名的 IP 地址并测试出网络连接情况

三、域名和域名服务器

1、域名 和 IP地址

域名和 IP 地址是一一对应的关系, 它是 IP 地址字符型的表达, 这种映射关系被存放在一台 DNS 服务器上

2、DNS(Domain Name System)

专门用来管理互联网上域名和 IP 对应关系的公网服务器

3、本地计算机的 IP 和 域名

开发测试时, 本地计算机 IP 一般是 127.0.0.1, 对应的域名是 localhost, 没有使用区别

四、端口

1、端口的概念

IP 地址可以用来标识唯一的计算机地址, 但是计算机上运行的不同服务无法仅用 IP 来标识, 于是使用了

IP + 端口号的方式来区分不同的服务, 每个服务都对应着一个唯一的端口号

2、端口的作用

客户端发送的请求, 通过指定的端口号, 可以把请求交给对应的服务来进行处理

注意:

ULR 中的端口号如果是 80, 一般可以省略

五、创建服务器步骤

  1. 引入 http 模块

  2. 创建服务实例

  3. 绑定事件, 监听请求

  4. 监听端口, 启动服务

1
2
3
4
5
6
7
// 引入http模块
const http = require('http');
const server = http.createServer((req, res) => {
console.log('有人访问服务器');
}).listen(3006,()=>{
console.log('Server running at http://127.0.0.1:3006');
});

六、请求对象和响应对象

Node 服务器接收到了客户端的请求, 就会调用给服务器绑定的 request 请求事件处理函数, 函数的第一个参数

是 Node 封装好的请求对象, 第二个参数是响应对象

1、requset 请求对象

提供了获取客户端相关的请求属性, 比如:

- req.url 请求的路径

- req.method 请求的方法

1
2
3
4
5
6
7
8
9
10
11
const http = require('http')

// 创建服务实例createServer()
const server = http.createServer((req, res) => {
console.log(`当前的请求路径为${req.url},请求方式是${req.method}`);
})

// 监听端口,开启服务
server.listen(3006, () => {
console.log('开启服务成功,请访问:http://localhost:3006');
})

2、response 响应对象

提供了服务器响应数据相关的方法, 比如:

- res.setHeader() 设置响应头

- res.end() 响应数据内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const http = require('http');

// 定义计数器
let num = 0;
const server = http.createServer((req, res) => {
// res提供了服务端响应数据的方法
// 1.响应数据给客户端 2.直接终止当前的请求
if (req.url !== '/favicon.ico') {

// 设置一个响应头,指定文件类型和编码方式
res.setHeader('Content-Type', 'text/html;charset=utf-8')
res.end(`<h3>hello 你是第${++num}位访问者!</h3>`);
// console.log(123);
}
// res.end()不会终止后续代码的运行,但请求已终止
})
// 监听端口,开启服务
server.listen(3006, () => {
console.log('开启服务成功,地址:http://localhost:3006');
})

七、模块化

1、什么是模块化

把一个大的功能需求拆分成若干功能项的小模块, 每个模块可组合, 分解和更换, 这就是模块化思想

2、Node.js 中的模块化

把一个大的文件拆分成多个互相依赖的小文件, 每个文件就是一个模块

3、好处

  1. 提高复用性 2. 代码可维护 3. 可以按需加载

4、模块化规范

模块在进行拆分和组合时需要遵守的规则, 主要考虑以下两点:

  1. 如何把自身模块成员向外暴露

  2. 如何把其他模块进行引入

5、Node.js中的模块分类

  1. 内置模块 (由 Node.js 官方提供的, 例如 fs, path, http 等)

  2. 自定义模块 (自己创建的 js 文件)

  3. 第三方模块 (由第三方开发的模块, 使用前需要先下载)

6、加载模块

​ require() 方法

注意:

​ 加载内置模块和第三方模块,都是直接传入模块名,加载自己的模块需要传入文件路径,并省略 .js 后缀

7、模块作用域

不同模块中定义的方法和变量,只能在当前模块内访问,这种模块级别的限制叫做模块作用域

  • 其他作用域

    局部作用域

    全局作用域

    块级作用域;使用let, const

8、module和exports

exports:{ } 默认为空对象

  1. module 对象的作用

    在每个模块中, module 这个内置的变量表示当前模块的引用

  2. module.exports 对象作用

    把模块中的成员导出给外部, 供外界进行加载和调用

  3. exports 对象

    exports 是 module.exports 的更简短的引用形式

注意:

(1) module.exports 的值就是当前模块最终导出的结果

(2) 可以通过 exports 访问和修改 module.exports 上的属性, 但不能通过赋值方式进行覆盖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
console.log(module.exports === {}); //false 复杂数据类型比较的是地址值
console.log(module.exports === exports); //true

exports = {
name: 'xh',
age: 12
}
module.exports = exports;
exports.say = function(params) {
console.log(123);
}
module.exports.sing = function(params) {
console.log(456);
};
//打印结果:{
// name: 'xh',
// age: 12,
// say: [Function(anonymous)],
// sing: [Function(anonymous)]
// }

// 原因:指向相同的地址

总结:

(1) 尽量避免 exports 对象重新赋值,添加一个导出成员 exports.xx=xx,

(2) 声明新对象,使用module.exports={ xxx };

八、CommonJS规范

Node.js 中的模块化遵循 CommonJS (cjs) 规范,它规定了模块的特性和依赖方式:

  1. 每个模块内部, module 变量代表当前模块

  2. module 变量是一个对象, module.exports 属性是对外暴露的接口

  3. 加载某个模块, 就是加载该模块的 module.exports 属性, require() 是加载的方法


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!