Node.js
官方文档: nodejs.cn/api-v16/doc…
插曲1:浏览器中JS组成部分
- JS和核心语法
- WebAPI
- DOM操作
- BOM操作
- 基于XMLHttpRequest的Ajax操作
- ...
插曲2:JS能被浏览器执行是基于浏览器中的JS解析引擎
- Chrome :V8
- Safri :JScode
- IE :Chakra
- ...
插曲3:JS能操作浏览器中的DOM和BOM 浏览器中内置了可被JS代码调用的Web API调用的函数;并由浏览器的JS解析引擎执行
插曲4:浏览器中JS运行环境(JS代码可以正常运行所需要的必要环境) 浏览器本身就是一个运行环境,具备条件:
- JS解析引擎(Chrome-V8):负责解析执行JS代码
- 内置WebAPI: 运行环境提供的特殊接口,只能在对应环境内使用
插曲5:JS后端开发条件-具备后端运行环境 借助于Node.js运行环境
Node.js说明
-
Node.js是一个基于Chrome-V8引擎的JS运行环境,可以脱离浏览器的一种运行环境;区别于浏览器做为前端开发的运行环境,Node.js用于后端开发
-
Node.js中JS运行环境:JS解析引擎(V8引擎);内置API
- JS解析引擎(V8引擎):负责解析执行JS代码
- 内置API: 区别于浏览器操作DOM,BOM等WebAPI,属于Node特有的API
-
基于Node.js基础运行环境有许多工具和框架;适用功能:
- 基于Express框架:www.expressjs.com.cn/ 可以快速构建Web应用
- 基于Electron框架:www.electronjs.org/ 可以构建跨平台的桌面应用
- 基于restify框架:restify.com 可以快速构建API接口项目
- 读取操作数据库,创建实用命令行工具...
Node.js安装
官网: nodejs.org/en/ 下载对应安装包
Node.js内置API
fs文件系统模块
fs模块是用来操作文件的模块。满足用户对文件操作需求
fs.readFile(), 读取指定文件中的内容: 语法格式fs.readFile(path,[options],callback)- path:文件路径
- options:可选;以什么编码格式读取文件
- callback: 文件读取完成,回调获取返回结果
//fileRead.txt
//你好啊
const fs = require('fs');
const oFinishData = new Promise((resolve, reject) => {
fs.readFile('./fileRead.txt', 'utf8', (err, data) => { //arg1失败返回;arg2成功返回
if (err) {
reject(err)
}
resolve(data)
});
});
oFinishData
.then((data) => {
console.log('data', data);
})
.catch((err) => {
console.log('err', err);
})
//data 你好啊
fs.writeFile(), 向指定文件中写入的内容 语法格式fs.writeFile(file,data,[options],callback)- path:文件路径的字符串
- data:写入内容
- options:可选;以什么编码格式写入文件
- callback: 文件写入完成,回调获取返回结果
//fileRead.txt
//你好啊
const fs = require('fs');
const sData = '你好啊';
fs.writeFile('./fileWrite.txt', sData, (err) => { //arg1失败返回;arg2成功返回
if (err) {
return console.log('【err】', err);
}
console.log('success');
});
- 整合运用案例:考试成绩整理
//成绩.txt
//小红=99 小白=100 小黄=56 小黑=66 小绿=48
const Fs = require('fs');
Fs.readFile('./成绩.txt', 'utf8', (err, data) => {
if (err) return console.log('获取失败');
const aInGrade = data.split(' ');
const aOutGrade = aInGrade.map((item) => { //map声明式渲染:操作并修改原始数组中的元素;forEach命令行式渲染:用于不改变原始数组,对每个元素遍历操作
const temp = item.split('=');
return `${temp[0]}: ${temp[1]}`
});
const sOutGrade = aOutGrade.join('\r\n'); //windows系统换行符
console.log(sOutGrade);
Fs.writeFile('./outGrade.txt', sOutGrade, 'utf8', () => {
if (err) return console.log('写入失败');
console.log('统计成功');
})
})
//outGrade.txt
// 小红: 99
// 小白: 100
// 小黄: 56
// 小黑: 66
// 小绿: 48
fs路径动态拼接
场景:Node以执行命令的目录用相对路径进行动态拼接
- 解决方案:用绝对路径进行查询文件
const Fs = require('fs');
//采用绝对路径避免相对路径错误,但是移植性很差
Fs.readFile('D:\\YNY\\gitRepository\\personal_study\\Node_api\\fs\\fileRead.txt', 'utf8', (err, data) => {
if (err) {
return console.log('读取失败'+err.message);
}console.log('读取成功:'+data);
});
- 解决方案:利用
__dirname自动获取文件当前的目录,恒定的地址
Fs.readFile(__dirname + '/fileRead.txt', 'utf8', (err, data) => {
console.log('__dirname',__dirname); //__dirname D:\YNY\gitRepository\personal_study\Node_api\fs
if (err) {
return console.log('读取失败'+err.message);
}console.log('读取成功:'+data);
});
path路径模块
require('path')导入模块使用
path.join进行路径的拼接,传入多个路径字符串path.basename检索字符串路径中的文件名; (path[,ext]);可选参数为文件扩展名
const Ps = require('path');
const Fs = require('fs');
Fs.readFile(Ps.join(__dirname, './fileRead.txt'), 'utf8', (err, data) => {
console.log(Ps.basename(Ps.join(__dirname, '/fileRead.txt'), '.txt')); //fileRead
console.log(Ps.basename(Ps.join(__dirname, '/fileRead.txt'))); //fileRead.txt
if (err) return console.log('Fail-', err);
console.log('Success:',data);
})
console.log(Ps.join('/a', '/b/c', '../', './d', 'e')); //\a\b\d\e
path.extname()获取文件扩展名
const Ps = require('path');
const sPathName = 'a/b/c/index.html';
console.log(Ps.extname(sPathName)); //.html