个人学习笔记 - Node.js

165 阅读3分钟

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说明

  1. Node.js是一个基于Chrome-V8引擎的JS运行环境,可以脱离浏览器的一种运行环境;区别于浏览器做为前端开发的运行环境,Node.js用于后端开发

  2. Node.js中JS运行环境:JS解析引擎(V8引擎);内置API

    • JS解析引擎(V8引擎):负责解析执行JS代码
    • 内置API: 区别于浏览器操作DOM,BOM等WebAPI,属于Node特有的API
  3. 基于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以执行命令的目录用相对路径进行动态拼接
  1. 解决方案:用绝对路径进行查询文件
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);
}); 
  1. 解决方案:利用__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