NodeJS异常处理和内置模块介绍

目录

一、nodejs介绍

二、REPL环境

三、nodejs模块系统

1、CommonJS模块化

2、ECMAScript模块

四、异常处理 

1、try-catch捕获异常

2、 使用回调函数捕获异常

3、使用EventEmitter接口的error事件

五、内置模块

1、http模块

2、fs模块

3、url模块

url.parse() 

​编辑

url.format() 

url.resolve(from,to) 

4、querystring模块 

5、path模块

6、util模块

util.callbackify()


一、nodejs介绍

NodeJS在2009年诞⽣,NodeJS 是⼀个开源与跨平台的 JavaScript 运⾏环境, 也叫Node.js或者Node。
所谓“运⾏环境”有两层意思:
⾸先,JavaScript语⾔通过Node在服务器运⾏,在这个意义上,Node有点像 JavaScript虚拟机;
其次,Node提供⼤量⼯具库,使得 JavaScript语⾔与操作系统互动(⽐如读写⽂ 件、新建⼦进程),在这个意义上,Node⼜是 JavaScript的⼯具库。
Node内部采⽤Google公司的V8引擎,作为JavaScript语⾔解释器;通过⾃⾏开发的libuv库,调⽤操作系统资源。

二、REPL环境

Node.js REPL Read Eval Print Loop: 交互式解释器)表示⼀个电脑的环境,类似 Windows 系统的终端或 Unix/Linux shell ,我们可以在终端中输⼊命令,并接收系统的响应。
使⽤ node 命令进⼊NodeJS软件的REPL 环境 REPL 环境中执⾏以下任务:
读取(Read)- 读取⽤户输⼊,解析输⼊的 Javascript 数据结构并存储在内存中
执行(Eval) -  执⾏输⼊的数据结构
打印(Print)- 输出结果
循环(Loop)- 循环操作以上步骤直到⽤户两次按下 ctrl+c 按钮退出
按两次ctrl+c退出,或者按ctrl+d退出:

三、nodejs模块系统

在模块根⽬录中使⽤ npm init 命令来⽣成 package.json ⽂件, package.json 是模块的清单⽂件,记录了当前模块的基本信息、依赖信息等。
version                  模块版本
name                     模块名称
description             模块描述
main                      ⼊⼝⽂件
private                    如果设置为 true,则可以防⽌应⽤程序 / 软件包被意外地发布到 npm
scripts                     脚本
dependencies          产品依赖
devDependencies   开发依赖
engines                   nodejs版本号
browserslist            ⽀持的浏览器
早期的 Javascript(ECMAScript5) 中是没有模块化的, NodeJS 推出后,使⽤的是便是CommonJS 模块规范。后来 ES6 出现后才出现了 ECMAScript 模块化,在 node-v12 可以使⽤ ECMAScript 模块化

1、CommonJS模块化

CommonJS规定,每个⽂件就是⼀个模块,有⾃⼰的作⽤域。在⼀个⽂件⾥⾯定义的变量、函数、类,都是私有的,对其他⽂件不可⻅。
CommonJS模块化使用 module.exports 的方式导出模块,使用 require 方法导入模块,require方法可以用来导入内置模块、本地文件或者第三方依赖:
require('http'); //内置模块
require('./xxx.js'); //文件
require('lodash'); //第三方依赖 需要下载

2、ECMAScript模块

ES6 中每⼀个模块即是⼀个⽂件,在⽂件中定义的变量,函数,对象在外部是⽆法获取的。如果你希望外部可以读取模块当中的内容,就必须使⽤export 来对其进⾏暴露( 输出 )。export命令规定的是对外的接⼝,必须与模块内部的变量建⽴⼀⼀对应关系,也就是说外部接⼝需要⽤这个接⼝名来引⽤。静态的 import 语句⽤于导⼊由另⼀个模块导出的绑定。
在使用es6模块化时,我们需要在package.json中添加代码:type:"module"

 

四、异常处理 

Node 是单线程运⾏环境,⼀旦抛出的异常没有被捕获,就会引起整个进程的崩溃。所以, Node 的异常处理对于保证系统的稳定运⾏⾮常重要。

1、try-catch捕获异常

try{
  console.log(a);
}catch(err){
  console.log(err,'捕获异常');
}
let b = 1
console.log(b);

结果如下:

⼀般来说, Node 只在很少场合才⽤ try/catch 语句,⽐如使⽤ JSON.parse 解析 JSON⽂本。这个结构⽆法捕获异步运⾏的代码抛出的异常。
try{
  setTimeout(()=>{
    console.log(a);
  },0)
}catch(err){
  console.log(err,'捕获异常');
}
let b = 1
console.log(b);

结果如下:

 运行结果中的异常不是try-catch捕获到的,而是代码执行到setTimeout内部的异常。

2、 使用回调函数捕获异常

Node 采⽤的⽅法,是将错误对象作为第⼀个参数,传⼊回调函数。这样就避免了捕获代码与发⽣错误的代码不在同⼀个时间段的问题。
let fs = require('fs')
fs.readFile('1.txt',function(err,data){
  if(err) throw err
  console.log(data.toString());
})

3、使用EventEmitter接口的error事件

发⽣错误的时候,也可以⽤ EventEmitter 接⼝抛出 error 事件。
let {EventEmitter} = require('events');
let emitter = new EventEmitter
// 使用on绑定事件 on(事件名,事件处理程序)
emitter.on('error',function(err){
  console.log(err.message);
})
// 触发事件
emitter.emit('error',{message:'出错了'})
emitter.emit('error',new Error('发生了错误'))

五、内置模块

nodejs的内置模块无需下载,使用时只需要使用require方法将它们引入即可。

1、http模块

创建一个http服务器:
第一步:使用require方法引入http模块

let http = require("http")

第二步:创建服务器

我们使⽤ http.createServer() ⽅法创建服务器,并使⽤ listen ⽅法绑定 8888 端⼝。 函数通过 request, response 参数来接收和响应数据。
let http = require('http')
http.createServer(function(request,response){
  //request请求对象  response响应对象
  // 发送http头部  返回json格式的数据
  response.writeHead('200',{'Content-Type':'application/json'})
  // 发送响应数据 
  response.end(JSON.stringify('Hello World'))
}).listen(8888)
// 终端打印
console.log('server is running http://127.0.0.1:8888')
终止进程使用 process.exit()

2、fs模块

fs filesystem 的缩写,该模块提供本地⽂件的读写能⼒,这个模块⼏乎对所有操作提供异步和同步两种操作⽅式,供开发者选择。
readFile()                  异步读取文件
readFileSync()          同步读取文件
writeFile()                  异步写入文件
writeFileSync()          同步写入文件
stat()、access()         判断⽂件是否存在
mkdir(path[, options], callback)             异步地创建⽬录
mkdirSync(path[, options])                    同步创建目录
readdir(path[, options], callback)           读取⽬录的内容
readdirSync(path[, options])                   同步读取⽬录的内容
let fs = require('fs');

// 同步读取文件 阻塞代码
let data = fs.readFileSync('笔记.txt', 'utf-8');
console.log(data); //buffer实例 

// 异步读取文件 非阻塞代码
fs.readFile('笔记.js', 'utf-8', (err, data) => {
  if (err) throw err
  console.log(data)
});
console.log('123');

let res = fs.readFileSync('笔记.txt', 'utf-8');
// 异步写入文件   res + '写入的内容'-->可以避免原先内容被覆盖
fs.writeFile('笔记.txt', res + '写入的内容', (err) => {
  if (err) throw err
  console.log('写入成功')
});

// 同步写入文件
fs.writeFileSync('笔记.txt', 'hello 写入内容', 'utf8');
console.log('写入成功');

// fs 判断文件是否存在 
fs.stat('笔记.txt', (err, stats) => {
  console.log(err ? '文件不存在' : '文件存在')
})
fs.access('笔记.txt', (err) => {
  console.log(err ? '文件不存在' : '文件存在')
})

// 创建目录 异步创建  {recursive:true}设置递归创建 
fs.mkdir('./test/a/b', {
  recursive: true
}, (err) => {
  if (err) throw err;
  console.log('创建成功')
});

// 读取目录  ..表示上一级目录
fs.readdir('..', (err, files) => {
  if (err) throw err
  console.log(files, '读取成功')
});

3、url模块

解析url请求地址

parse           将url字符串地址转换为URL对象

format          构建⼀个URL字符串

resolve         合并url字符串

url.parse() 

url字符串地址转换为URL对象

let url = require('url');
let res = url.parse('http://admin1:[email protected]:8080/user/login?page=1&pageSize=10#hash');
console.log(res);

结果如下:

url.format() 

构建⼀个 URL 字符串
let url = require('url');
let res = url.parse('http://admin1:[email protected]:8080/user/login?page=1&pageSize=10#hash');
console.log(url.format(res)); //http://admin1:[email protected]:8080/user/login?page=1&pageSize=10#hash

url.resolve(from,to) 

合并 url 字符串
const url = require('url');
console.log(url.resolve('/one/two/three', 'four'));// '/one/two/four'
console.log(url.resolve('http://example.com/', '/one'));// 'http://example.com/one'
console.log(url.resolve('http://example.com/one', '/two'));// 'http://example.com/two'

我们可以使用点语法获取url对象的某个属性,并修改它们的值:

const myUrl = new URL('http://121.199.0.35:8888/user/login?page=1&pageSize=10');
console.log(myUrl);
console.log(myUrl.searchParams); //获取
myUrl.port = 8080 //修改

myUrl打印结果:

4、querystring模块 

该模块⽤来处理查询字符串
parse                 将查询字符串解析为一个对象
stringify            将对象序列化为查询字符串
escape              对查询字符串进行编码
unescape         对查询字符串进行解码
let qs = require('querystring');
// 1.parse 将查询字符串转换成对象
let name = 'name=张三&age=18';
console.log(qs.parse(name)); //{ name: '张三', age: '18' }
// 2.stringify 将对象转成查询字符串 
console.log(qs.stringify({
  page: 1,
  pageSize: 10
})); //page=1&pageSize=10
// 3.escape 对查询字符串编码 
console.log(qs.escape('name=张三&age=18')); //name%3D%E5%BC%A0%E4%B8%89%26age%3D18
// 4.unescape 对查询字符串解码
console.log(qs.unescape('name%3D%E5%BC%A0%E4%B8%89%26age%3D18')) //name=张三&age=18

5、path模块

用来解析路径

basename          返回路径中最后⼀部分
dirname             返回路径中代表⽂件夹的部分
extname             返回路径中⽂件的后缀名
parse                  返回路径字符串的对象
format                 从对象中返回路径字符串,和 path.parse 相反
isAbsolute          判断参数 path 是否是绝对路径
join                      连接多个地址,可以识别"." ".."
normalize            标准化路径,可以识别"." ".."
relative    ⽤于将绝对路径转为相对路径,返回从 from to 的相对路径 ( 基于当前⼯作⽬录 )
resolve     解析为绝对路径,给定的路径的序列是从右往左被处理的,后⾯每个 path 被依次 解析,直到构造完成⼀个绝对路径。
sep         平台的⽂件路径分隔符, '\' '/'
win32      提供包含上述 path 的⽅法的对象,不过总是以 win32 兼容的⽅式交互
posix       提供包含上述 path 的⽅法的对象
delimiter  路径分隔符, linux 操作系统分隔符为 ":" windows 操作系统分隔符为 ";"
let path=require('path');
// 文件路径
let name='C:/nodejs/hello.html';
// basename 方法返回path路径的最后一部分 文件路径 最后一部分路径文件拓展名
console.log(path.basename(name)); //hello.html
console.log(path.basename(name,'.html')); //hello
// dirname 方法返回文件夹 部分
console.log(path.dirname(name)); //C:/nodejs
// extname 方法 文件后缀名
console.log(path.extname(name)); //.html
// // parse 方法 解析
console.log(path.parse(name)); //{root: 'C:/', dir: 'C:/nodejs', base: 'hello.html', ext: '.html', name: 'hello' }
console.log(path.isAbsolute(name)); //true
console.log(path.isAbsolute('./1.js')); //false

console.log(path.relative('/admin/user/day01','/admin/user/day02'));//..\day02

console.log(path.win32===path); //true
console.log(path.posix===path) //false

6、util模块

util.callbackify()

async 异步函数 ( 或者⼀个返回值为 Promise 的函数 ) 转换成遵循异常优先的回调⻛格的函数,例如将 (err, value) => ... 回调作为最后⼀个参数。 在回调函数中,第⼀个参数为拒绝的原因( 如果 Promise 解决,则为 null ) ,第⼆个参数则是解决的值。
let util = require('util');
async function a() {
  console.log('我被执行了')
};
// 返回一个回调函数
let callback = util.callbackify(a);
callback((err, data) => {
  if (err) console.log(err);
  console.log(data)
});

猜你喜欢

转载自blog.csdn.net/lq313131/article/details/127448148