昔洛 的个人博客

Bug不空,誓不成佛

  menu
70 文章
14633 浏览
6 当前访客
ღゝ◡╹)ノ❤️

NodeJS 后端编程(中)

学习内容

  • 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请求时,请求参数都包含在请求体中
    • 响应时发送的内容称为 响应报文
      • 响应报文由3部分组成: 状态行,响应头, 响应体
        • 状态行: HTTP/1.1 200 OK
        • 响应头:响应发送时的一些附加数据
        • 响应体:就是服务端响应的数据内容

通过req.url进行不同的文件响应

  • req.url 可以获取到用户请求的地址: 例如: /index.html / /base.css /style
  • 操作步骤:
    • 判断req.url检测需要响应的是哪个文件
    • 读取文件
      • fs.readFileSync(地址, 'utf8可选'); 同步的文件读取方式
        • 返回值为读取到的数据,如果读取失败出现报错。
    • 设置响应头Content-Type
    • 进行数据响应
      • 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.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
        • 无需查看或操作,记录了当前使用的包的版本和下载地址
    • npm install/i 包名:安装指定的包
    • npm i/npm install:当前项目下只有 package.json 又没有 node_modules 的时候使用,用于让 npm 下载相关的依赖
  • npm 的相关文件
    • node_modules 目录:存放了 npm 下载的包
      • 如果想将项目拷贝给别人或上传到github,通常会删除node_modules
      • 通过创建 .gitignore 文件添加要忽略的文件,可以使用通配符进行类型忽略
  • 全局安装:npm install -g 包名
  • nrm:node 的资源地址管理器
    • 安装方式:npm install -g nrm
    • nrm 常用命令:
      • nrm --version 查看版本
      • nrm ls 查看所有的资源名称和地址
      • nrm use 资源名称,换源
希望所有的 Bug 都会报错~