浅谈node内置模块

138 阅读8分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

JavaScript回顾

作用:

  • 网页特效(监听用户的一些行为让网页做出对应的反馈)
  • 表单验证(针对表单数据的合法性进行判断)
  • 数据交互(获取后台的数据,渲染到前端)
  • 服务端编程(node.js)

为什么能操作DOM、BOM、AJAX:

  • JavaScript通过浏览器的内置API来操作DOM/DOM/和ajax等等,

引擎:

  • 程序员写好待执行的JavaScript代码后,这时的JavaScript代码只是一串字符串,是JavaScript引擎解析我们的代码并执行

总结:1、引擎负责解析和执行JavaScript代码(谷歌浏览器引擎是v8)

2、内置API是由运行环境(浏览器)提供的接口,只能在接口所属的运行环境(浏览器)中被调用

浏览器引擎渲染页面、js引擎解析代码和执行代码

node.js

介绍:

node.js是一个JavaScript的运行环境

JavaScript代码写在浏览器环境中就是前端开发(前端运行环境)

JavaScript代码写在node.js中,就是后端开发(后端运行环境)

作用:

在node.js中无法调用DOM和BOM等浏览器的内置API

终端命令

// 用 node命令 执行 js 文件   ( 文件的路径相对或者绝对路径都可以)
node   ./index.js
​
使用 ↑ 键,可以快速定位到上一次执行的命令
使用 tab 键,能够快速补全路径
使用 esc 键,能够快速清空当前已输入的命令
输入 cls 命令,可以清空终端

模块的介绍

Node中,规定每个JS文件都是一个小模块。一个项目由许许多多的小模块(JS文件)组合而成

模块化把一个复杂问题,划分成若干模块的过程

好处:

1、提高了代码的复用性

2、提高了代码的可维护性

3、可以实现按需加载

模块的分类

模块分为三大类:

  • 内置模块(由官方提供的,如fs、path、http等)
  • 自定义模块(由用户创建的每个js文件,都是自定义模块)
  • 第三方模块(由第三方开发出来的模块,使用前需下载)

加载模块

使用强大的require()方法,可以加载需要的内置模块、用户自定义模块、第三方模块

//加载内置模块
const fs=require('fs') 
​
//加载用户的自定义模块
const custom=require('./custom,js') //js后缀名可以省略//加载第三方模块
const moment=require('moment')

使用require()方法加载模块时,会执行加载模块中的代码

自定义模块

我们创建的每个JS文件都是一个自定义模块,并且具有模块作用域,也就是在一个模块中创建的变量、常量、函数等等一切,都只能在当前模块中使用

a 文件,通过 module.exports = {导出的内容}  // 导出内容
​
b 文件,通过 require('./a'); //导入a文件导出的内容

导出内容

module.exports={导出的数据}
​
let a = 1
let b = 1
let c = 1
let f1 = function () { }
​
导出方法一:
 module.exports = {
    a: a,
    f1: f1
} 
​
导出方法二:
 module.exports.aa = a
module.exports.fn = f1 
​
导出方法三:导出数据时(对象名和属性名一样可以简写)
module.exports = { a, f1 }

导入内容

const obj = require('./03-导出数据')//这里得到的 obj,就是 { a, f1 }const fs = require('fs')//这里导入的是内置模块const express = require('express')//这里导入的是第三方模块

1、一个模块导出什么,另一个模块加载后,就会得到什么

2、导入自定义模块时必须带路径,即便两个JS文件在同一个目录,也要加路径

内置模块

内置模块是Node.js 平台自带的一套基本的 API(功能模块)。也叫做核心模块。

fs文件模块

满足用户对文件的操作需求

const fs=require('fs') //先导入
​
fs.readFile() //读取执行文件中的内容
fs.writeFile() //向指定的文件中写入内容(有则覆盖,无则添加)
fs.appendFile() //向指定的文件中追加内容(有则追加)
fs.access()//判断文件是否存在
​
回调函数里的两个参数:
失败: err的值为错误对象   data值为undefined
成功: err的值为nul       data的值为读取的结果 

读取文件

fs.redFile('文件路径''以什么编码格式读取文件',文件读取完成后通过回调函数拿到读取结果) 
​
fs.readFile('./text/01.txt', 'utf8', (err, data) => {
    if (err) {
        return console.log(err.meaasge) //失败就返回失败信息
    }
    console.log(data) //成功就打印出获取的文件内容
})

只要失败,err里就会有值

写入文件

fs.writeFile('文件路径''要写入的内容''以什么编码格式写入文件内容',文件写入完成后的回调函数) 
​
fs.writeFile('./text/02.txt', '我是写入的内容', 'utf8', (err) => {
    if (err) {
        return console.log(err.message) //失败就返回失败信息,成功则在指定的文件中写入内容
    }
​
}) 

注意:

如果写入文件不存在,则会创建文件(但不能递归创建)

如果写入文件中有内容,将会被覆盖

只要失败,err里就会有值

追加内容

fs.appendFile('文件路径''要追加写入的内容''以什么编码格式写入文件内容',文件写入完成后的回调函数) 
​
fs.appendFile('./text/03.txt', '我是再次写入的内容\n', 'utf8', (err) => {
    if (err) {
        return console.log(err.message)//失败就返回失败信息,成功则在指定的文件中追加内容
    }
})

注意:

如果写入文件不存在,则会创建文件(

如果写入文件中有内容,则在写入的文件中追加内容

只要失败,err里就会有值

判断文件是否存在

fs.access('文件路径', [判断是否可读可写可在],文件判断后的回调函数 )
​
fs.access('./text/03.txt', fs.constants.F_OK, err => {
    if (err) {
        return console.log('文件不存在') //失败返回的结果
    }
    console.log('文件存在')  //成功返回的结果
})

参数2可选;

  • fs.constants.F_OK或不填,表示判断文件是否存在;
  • fs.constants.R_OK表示判断文件是否可读;
  • fs.constants.W_OK表示文件是否可写 ;

只要失败,err里就会有值

path路径模块

满足用户对了路径的处理需求

const path =require('path')//先导入
​
path.join()//将多个路径片段拼接成一个完整的路径字符串
path.basename()//从路径字符串中,将文件名解析出来
path.extname() //获取路径中的扩展名

路径的拼接

path.join('路径', '路径', ……) //返回拼接好的字符串
​
__dirname:表示当前文件所在的文件夹的目录
console.log(__dirname) // D:/study/100/Node01/code
​
path.join('css', 'index.css') // css/index.css
​
path.join('a', 'b', 'c', 'd.js');// a/b/c/d.js
​
path.join(__dirname, 'js', 'a.js')//D:/study/100/Node01/code/js/a.js

1、今后凡是涉及到路径拼接的操作,都要使用path.join()方法处理

2、Node中,有一个全局变量 __dirname ,它表示当前 JS 文件所在的绝对路径

获取路径文件名

可以获取路径中的最后一部分,通过这个方法获取路径中的文件名

path.basename(文件路径) //返回路径中的文件名(带扩展名)
path.basename('./text/01.txt')  //01.txt
​
path.basename(文件路径,'不带的文件扩展名') //返回路径中的文件名(不带扩展名)
path.basename('./text/01.txt', '.txt')//01

获取路径文件扩展名

path.extname('文件路径');//返回扩展名
​
path.extname('css/index.css'); // .css
​
path.extname('E:/a/b/index.html'); // .html

querystring模块

所有和查询字符串相关的操作,都可以通过这个模块

const querystring =require('querystring') //先导入

字符串转js对象

querystring.parse('id=1&name=zs&age=20');//{ id: 1, name: 'zs', age: 20 }

Json与Js数据之间的转换: (1)、JSON.parse()//将json格式转换成js格式 反序列化 (2)、JSON.stringify()//将js格式转换成json格式 序列化

js对象转字符串

querystring.stringify({ id: 1, name: 'zs', age: 2 });//id=1&name=zs&age=2

Json与Js数据之间的转换: (1)、JSON.parse()//将json格式转换成js格式 反序列化 (2)、JSON.stringify()//将js格式转换成json格式 序列化

http模块

node.js提供的http模块用来创建web服务器的模块

通过http模块提供的http:createSerever()方法,能把一台普通的电脑,变成一台web服务器,从而对外提供web资源服务

const http=require('http')//先导入

创建web服务器的步骤

1、导入http模块  ------写法固定
const http=require('http')
​
​
2、创建web服务器实例 ------写法固定
const server=http.createServer()
​
​
3、为服务器的实例对象绑定request事件//可监听客户端发送过来的网络请求
server.on('request',(req,res)=>{
       req:是客户所有请求的数据   //是请求对象,它包含了与客户端相关的数据和属性   
       res:是服务器响应的数据    //是响应对象,处理响应信息,都可以通过它完成
})
​
​
4、启动服务器 ------写法固定
server.listen(端口号,回调函数)

req对象

//所有用户请求相关信息,都可以通过它获取到
req.url 是获取请求地址中的除根路径以外的部分
​
ttp://localhost:3006                        ===>   req.url = '/'
http://localhost:3006/api/getbooks          ===>   req.url = '/api/getbooks'
http://localhost:3006/index.html            ===>   req.url = '/index.html'
http://localhost:3006/index.html?id=1       ===>   req.url = '/index.html?id=1'
​
req.method 是获取请求方式   如得到 GET 、POST等等

res对象

//处理响应信息,都可以通过它完成
res.statusCode = 200//可以设置响应状态码
res.setHeader('key', 'value'); //可以设置响应头
res.setHeader('Content-Type', 'xxx/xxx; charset=utf-8'); //如果响应中文,必须设置这个,否则乱码 
res.end(响应体); //设置响应体,并做出响应
​
这个方法,必须放到最后;做出响应后,不能再设置响应状态码和响应头了,也不能多次调用 res.end() 方法
响应体,只能是 字符串,如果要响应对象必须先转成字符串,即便是数字也必须加引号,比如 '123'