目录
一、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()
读取(Read)- 读取⽤户输⼊,解析输⼊的 Javascript 数据结构并存储在内存中执行(Eval) - 执⾏输⼊的数据结构打印(Print)- 输出结果循环(Loop)- 循环操作以上步骤直到⽤户两次按下 ctrl+c 按钮退出
version 模块版本name 模块名称description 模块描述main ⼊⼝⽂件private 如果设置为 true,则可以防⽌应⽤程序 / 软件包被意外地发布到 npm 。scripts 脚本dependencies 产品依赖devDependencies 开发依赖engines nodejs版本号browserslist ⽀持的浏览器
require('http'); //内置模块
require('./xxx.js'); //文件
require('lodash'); //第三方依赖 需要下载
try{
console.log(a);
}catch(err){
console.log(err,'捕获异常');
}
let b = 1
console.log(b);
结果如下:
try{
setTimeout(()=>{
console.log(a);
},0)
}catch(err){
console.log(err,'捕获异常');
}
let b = 1
console.log(b);
运行结果中的异常不是try-catch捕获到的,而是代码执行到setTimeout内部的异常。
let fs = require('fs')
fs.readFile('1.txt',function(err,data){
if(err) throw err
console.log(data.toString());
})
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方法将它们引入即可。
创建一个http服务器:
第一步:使用require方法引入http模块
let http = require("http")
第二步:创建服务器
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')
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, '读取成功')
});
解析url请求地址
parse 将url字符串地址转换为URL对象
format 构建⼀个URL字符串
resolve 合并url字符串
将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);
结果如下:
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
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 //修改
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
用来解析路径
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
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)
});