学习内容
- ES6中的模块设置方式
- nodejs中的内置模块
- fs 模块
- path 模块
- http 模块
- 响应不同文件
- 静态托管
- get 请求
- post 请求
- npm
ES6中的模块设置方式
- 基本格式:require(模块的地址或内置模块的名称);
- 具体操作步骤:
-
被其他模块引入的模块中操作: demo1.js
-
将需要被其他模块使用的数据进行暴露(导出)
-
module.exports = { 数据 };
-
exports.数据名 = 数据; // 可以设置多个
-
-
使用其他模块的那个模块中操作: demo2.js
-
通过require(要引入的模块的地址)
-
通过常量接收,防止不小心被修改了。
-
使用常量内部的功能即可。。。
-
-
nodejs中的内置模块
nodejs中内置模块与浏览器中的js内置功能的区别
- window
- 浏览器中的功能都是可以直接访问的,都是全局的功能,操作时需要自己进行改进处理
- document
- console
- nodejs
- nodejs中的内置模块都是独立的功能,如果不进行引入就无法使用
- 所以操作时,如果希望使用内置模块需要先进行引入操作。
fs 模块
是node中用来进行文件操作的模块
-
readFile() 读取文件
- 是一个异步的读取文件方法
// 1 引入fs模块,才能使用内部的功能 // - 内置模块引入时,直接书写模块名称即可 const fs = require('fs'); // 2 使用readFile()读取一个文件的内容 // 参数1: 文件路径 // 参数2: 字符集 'utf8' // 参数3: 回调函数,会在文件读取完毕后执行 // - 参数1:err 错误信息 // - 参数2:data 文件的内容 // 如果读取文件成功: // - err为null, data为文件的内容 // 如果读取文件失败 // - err为错误对象, data为undefined fs.readFile('./demo.txt', 'utf8', (err, data) => { if (err) { // 我们管设置的报错称为 '抛异常' throw 'your file is bad bad'; } console.log(data); }); // 没有设置字符集参数时,读取的内容时buffer形式,可以通过toString进行处理 fs.readFile('./demo.txt', (err, data) => { if (err) { // 我们管设置的报错称为 '抛异常' throw 'your file is bad bad'; } console.log(data); // buffer console.log(data.toString()); // 字符串 });
-
fs.readFileSync(path,code)
:同步读取文件,直接返回文件内容 -
fs.writeFile(path,content,code,callback)
: 异步写文件- path: 文件路径
- content:写入内容
- code:字符集编码
- callback 回调函数
-
fs.writeFileSync(path,cotent,code)
:同步写文件
path模块
- path是一个node的内置模块,引入后使用
- path.join() 用于进行路径信息的合并处理
- 参数:传入各种各样的地址(可以含有相对路径和绝对路径)
- 返回值:处理后的可以使用的地址
- 以后进行文件操作的地址设置方式:
path.join(__dirname, '习惯的相对路径')
http 模块
- http 协议
- 作用:用来对请求响应发送方式设置的一种约定。
- 组成:
- 请求:是由客户端发起的,由服务端接收处理
- 响应:是由服务端发起的,由客户端接收处理
- 内容形式:
- 请求时发送的内容称为请求报文:
- 请求报文由3部分组成: 请求行, 请求头, 请求体
- 请求行: GET / HTTP/1.1
- 请求头: 包含了请求发送时的一个附加数据
- Content-Type 请求发送数据的内容类型
- User-Agent 客户端设备的相关信息
- 请求体:包含了请求发送的请求参数
- 发送get请求时,请求体为空
- 因为get请求的请求参数在请求行中传递
- 发送post请求时,请求参数都包含在请求体中
- 发送get请求时,请求体为空
- 请求报文由3部分组成: 请求行, 请求头, 请求体
- 响应时发送的内容称为 响应报文:
- 响应报文由3部分组成: 状态行,响应头, 响应体
- 状态行: HTTP/1.1 200 OK
- 响应头:响应发送时的一些附加数据
- 响应体:就是服务端响应的数据内容
- 响应报文由3部分组成: 状态行,响应头, 响应体
- 请求时发送的内容称为请求报文:
通过req.url进行不同的文件响应
- req.url 可以获取到用户请求的地址: 例如: /index.html / /base.css /style
- 操作步骤:
- 判断req.url检测需要响应的是哪个文件
- 读取文件
- fs.readFileSync(地址, 'utf8可选'); 同步的文件读取方式
- 返回值为读取到的数据,如果读取失败出现报错。
- fs.readFileSync(地址, 'utf8可选'); 同步的文件读取方式
- 设置响应头Content-Type
- 不同文件的内容类型称为MIME-Type,可以到网站上进行查询
- https://www.w3school.com.cn/media/media_mimeref.asp
- 进行数据响应
- res.end(数据); 字符串和buffer都可以进行响应
托管静态资源的方式
静态资源指的就是某一个文件,例如css、js、图片文件
- 步骤:
- 首页的请求处理方式与之前相同
- 剩余的文件进行静态资源托管设置
- 检测url是否以/public/开头即可,使用 字符串.startsWith()
- 检测后缀名将不同文件进行对应的处理
- path.extname(req.url); 可以取出地址中的后缀(扩展名)
- 设置地址读取文件
- 通过try..catch进行错误信息的捕获和处理
try { // 这里面书写正常的代码,如果代码预期会出现报错,使用try...catch // - try块中的代码出现报错后,错误不会真的报错来,而是执行后面的catch块内容 } catch (err) { // err是错误信息,可选 // - 这里用来进行try块报错后的处理操作 } finally { // 可以省略finally,不常用,反正都会执行 }
- res.statusCode 状态码设置
- 常见的状态码
- 200 成功
- 302 重定向 (跳转)
- 404 失败(没找到对应资源)
- 500 服务端内部错误
- 这个状态码是一种约定,响应时应当根据实际情况进行对应的状态码设置,不要瞎编。
- 常见的状态码
GET 请求
- 需要取到req.url中的pathname和query
- 使用url模块的parse()进行转换
- 参数2为true,将参数转换为对象
- JSON格式的转换问题
- JSON.stringify()
- application/json
POST 请求
- 接收方式的区别:(因为post数据在请求体中发送,同时数据量比get要大)
- req.on('data', fn); 请求进行数据传输时会触发这个事件(会多次触发)
- fn接收一个参数是某一段请求参数的buffer格式
- 需要通过一个字符串进行拼接,buffer会自动转换为字符串类型
- req.on('end', fn); 请求的数据接收完毕时触发
- 我们如果要使用post的请求参数,应当在end事件中进行操作
- end中接收的请求参数为urlencoded不好操作
- 使用内置模块querystring的parse() ,可以将urlencoded转换为对象结构
- req.on('data', fn); 请求进行数据传输时会触发这个事件(会多次触发)
- req.method 可以获取请求方式,值是一个大写的字符串 'GET' 'POST'
if (req.url === '/common/post' && req.method === 'POST') { // 3.1 进行事件设置和参数接收 // - 数据传输中,数据为buffer格式 // - 因为数据可能是一段一段发送的,最终应当全部拼接起来再进行使用 // - 设置变量默认值为'',进行+=操作时,buffer会自动转换为字符串拼接 let data = ''; req.on('data', (temp) => { data += temp; console.log(temp); }); req.on('end', () => { // 3.2 需要将接收的urlencoded数据转换为对象结构 // - 需要使用内置模块 querystring // - qs.parse('urlencoded格式的数据'); 结果为对象 /* console.log(data); console.log(qs.parse(data)); */ // - 这个post请求测试接口的功能为: // - 将用户发送的请求参数发还给用户,并添加三个属性code、msg、_t data = qs.parse(data); // 接收转换完毕的对象 Object.assign(data, { _t: Date.now(), code: 200, msg: '响应成功' }); // 3.3 设置响应头并进行响应 res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify(data)); });
NPM
- npm:用来对 node 进行包管理的管理器,包就相当于一个jquery.js文件
- 常用命令:
- npm init
- package.json 当前项目的相关信息
- dependencies 当前项目依赖于哪些包
- package-lock.json
- 无需查看或操作,记录了当前使用的包的版本和下载地址
- package.json 当前项目的相关信息
- npm install/i 包名:安装指定的包
- npm i/npm install:当前项目下只有 package.json 又没有 node_modules 的时候使用,用于让 npm 下载相关的依赖
- npm init
- npm 的相关文件
- node_modules 目录:存放了 npm 下载的包
- 如果想将项目拷贝给别人或上传到github,通常会删除node_modules
- 通过创建 .gitignore 文件添加要忽略的文件,可以使用通配符进行类型忽略
- node_modules 目录:存放了 npm 下载的包
- 全局安装:npm install -g 包名
- nrm:node 的资源地址管理器
- 安装方式:
npm install -g nrm
- nrm 常用命令:
- nrm --version 查看版本
- nrm ls 查看所有的资源名称和地址
- nrm use 资源名称,换源
- 安装方式:
希望所有的 Bug 都会报错~