NodeJS异常处理和内置模块介绍
NodeJS在2009年诞⽣,NodeJS 是⼀个开源与跨平台的 JavaScript 运⾏环境, 也叫Node.js或者Node。所谓“运⾏环境”有两层意思:⾸先,JavaScript语⾔通过Node在服务器运⾏,在这个意义上,Node有点像 JavaScript虚拟机;其次,Node提供⼤量⼯具库,使得 JavaScript语⾔与操作系统互动(⽐如读写⽂ 件、新建⼦进程),在这个意义上,Nod
·
目录
一、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:123321@sub.briup.com:8080/user/login?page=1&pageSize=10#hash');
console.log(res);
结果如下:
url.format()
构建⼀个
URL
字符串
let url = require('url');
let res = url.parse('http://admin1:123321@sub.briup.com:8080/user/login?page=1&pageSize=10#hash');
console.log(url.format(res)); //http://admin1:123321@sub.briup.com: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)
});
更多推荐
已为社区贡献5条内容
所有评论(0)