Node.js中的FS文件系统、path、模块化、npm与包以及数据库操作

一、认识Node.JS

1.默认已经掌握的技术

  • HTML
  • css
  • JavaScript

2.浏览器中的javaScript组成部分

3.为什么js可以在浏览器中运行

因为浏览器中有JavaScript的解析引擎

  • Chrom浏览器:V8
  • FireFox浏览器:OdinMonkey(奥丁猴)
  • Safri浏览器:JSCore
  • IE/Edge浏览器:Chakra(查克拉)

其中:Chrome浏览器中的V8引擎性能是最好的!

4.为什么js可以操作DOM和BOM

每个浏览器内置了DOM、BOM这样的API函数,因此浏览器中的JavaScript才可以调用他们

5.浏览器中有JavaScript的运行环境

  • V8引擎负责解析和执行JavaScript代码
  • 内置API是由运行环境提供的特殊接口,只能在所属的运行环境中被调用

6.js能够做后端的开发

  • java
  • python
  • php
  • node.js

7.什么是Node.js

Node.js is JavaScript runtime built on Chrome's V8 JavaScript engine

Node.js是一个基于ChromeV8引擎的JavaScript运行环境

官方网址:https://nodejs.org/zh-cn

Node.js中的javaScript运行环境

8.node.js可以做什么

Node.js作为一个javaScript的运行环境。仅仅提供了基础的功能和API,然而,基于node.js提供的这些基础功能,很多强大的工具和框架陆续出现了,层出不穷,所以学会了Node.js,就可以让前端程序员做更多的工作和岗位。

  • 基于Express框架,可以快速构建Web应用,官方网址: https://www.expressjs.com.cn/
  • 基于Electron框架,可以构建跨平台的桌面应用,官方网址:http://electron.org/
  • 基于restify框架,可以快速构建API接口项目,官方网址:http://erestify.com/

总之,Node.js是大前端时代的"大宝剑",有了Node.js这个超级buff的加持,前端程序的行业竞争力会增强。

9.Node.js好学吗

好学!

会javaScript,就能学会Node.js!!!

二、学习Node.js

1.Node.js怎么学

  • 浏览器中的JavaScript学习路径
    • ECMAScript(JS基础语法)
    • 浏览器内置的API(DOM+BOM)
    • 第三方库(jQuery等)
  • Node.js的学习路径
    • ECMAScript(JS基础语法)
    • Node.js内置的API(fs、path、http等等)
    • 第三方API模块(mysql、Express、Electron和restify等等)

2.Node.js环境安装

https://nodejs.org/zh-cn

如果希望通过Node.js运行javaScript代码,则必须在计算机上安装Node.js才行

安装包可以从官网取下载,地址:https://nodejs.org/zh-cn

LTS:长期稳定版,对于追求稳定性的企业级项目来说,推荐安装LTS版本的Node.js

current:新特性尝鲜版,对于热衷尝试新特性的用户来说,推荐安装current版本的Node.js,但是current版本中可能出现Bug或者是安装漏洞,因此不推荐在企业级的项目中使用。

如果下的免安装版本还需进行以下操作,如果下的安装版本直接下一步下一步就行了

  • 解析压缩包

  • 复制解压后的文件路径(解压的路径不要包含中文或者是空格)

  • 按下window键,搜索"环境变量"

  • 验证

3.终端

Termianal: 终端。是专门为开发人员设计的。用于实现人机交互的一种方式。

作为一名合格的程序员,我们必须要记忆一些常用的终端命名,来辅助我们更好的操作与使用计算机。

  • 使用键,可以快速定位到上一次执行的命令
  • 使用tab键,快速补全路径
  • 使用esc键盘,能够快速清空当前已经输入的指令
  • 输入cls命令,可以清空终端

三、FS文件系统

1.简介

fs模块,是Node.js官方提供的、用来操作文件的模块,提供了一系列的方法和属性,用来满足用户对文件操作需求。

  • fs.readFile():读取指定
  • fs.writeFile():涌向向指定的文件写入内容

2.fs.readFile()

2.1 语法

javascript 复制代码
fs.readFile(path[,options],callback)

语法解读:

  • 参数一:必选参数,字符串,用来表示文件的路径
  • 参数二:可选参数,表示用什么编码格式
  • 参数三:必选参数,文件读取完成后,通过回调函数拿到读取的结果
javascript 复制代码
const fs = require('node:fs');

fs.readFile('/Users/joe/test.txt', 'utf8', (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(data);
});

2.2 入门程序

javascript 复制代码
//1.导入fs模块,导入fs模块的目的是用来操作文件
const fs = require('fs');

//2.读取文件的语法:fs.readFile(path[,options],callback) 该方法用来读取文件
//语法解读:
//- 参数一:必选参数,字符串,用来表示文件的路径
//- 参数二:可选参数,表示用什么编码格式
//- 参数三:必选参数,文件读取完成后,通过回调函数拿到读取的结果
//         回调函数中有两个参数,第一个是err
fs.readFile('./files/11.txt', 'utf8', function(err, dataStr) {
    //如果读取成功:则err的值是null
    //如果读取失败:则err的值是一个错误对象,dataStr的值为undefined
    console.log(err);
    console.log(dataStr);
});

2.3 判断文件是否读取成功

可以判断err对象是否为null,从而知晓文件的读取结果

javascript 复制代码
//1.导入fs模块
const fs = require('fs');

//2.读取文件
fs.readFile('./files/11.txt','utf8',function(err,dataStr){
    //如果不为null,也就是发生了错误
    if(err){
        return console.log('读取文件失败!');
    }
    console.log('读取文件成功!'+dataStr);
})

3.fs.writeFile()

3.1 语法

java 复制代码
fs.writeFile(file,data[,options],callback)

参数解读

  • 参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径
  • 参数2:必选参数,表示写入的内容
  • 参数3:可选参数,可选参数,表示用什么编码格式,默认值是ut8
  • 参数4:必选参数,文件写入后完成的回调函数

3.2 写入内容

javascript 复制代码
//1.导入fs文件系统模块
const fs = require('fs')

//2.调用fs.writeFile(file,data[,options],callback)
// 参数解读
// - 参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径
// - 参数2:必选参数,表示写入的内容
// - 参数3:可选参数,可选参数,表示用什么编码格式,默认值是ut8
// - 参数4:必选参数,文件写入后完成的回调函数

fs.writeFile('./files/3.txt','ok123',function(err){
    //如果写入成功:则err的值等于null
    //如果写入失败:则err的值等于错误对象
    if(err){    
        return console.log('文件写入失败!'+err.message)
    }
    console.log('文件写入成功!');
})

4.练习

需求:

  • 使用fs文件系统容模块,将成绩.txt文件中的考试数据,整理到成绩-ok.txt文件中

  • 整理之前成绩.txt文件中的数据格式如下:

    text 复制代码
    小红-99 小白-100 小黄-70 小黑-66 小绿-88
  • 整理完之后,成绩-ok.txt文件中的数据格式如下:

    text 复制代码
    小红:99
    小白:100
    小黄:70
    小黑:66
    小绿:88
javascript 复制代码
//1.导入fs模块
const fs = require('fs');
//2.读取文件
fs.readFile('./files/成绩.txt','utf8',function(err,dataStr){
    if(err){
        return console.log('读取文件失败!'+err.message)
    }
    console.log('读取文件成功!'+dataStr);
    //3.将数据利用数组中的方法split()进行切割
    const arrOld = dataStr.split(' ');
    //4.利用循环遍历切换后的数组,将-换成:
    const arrNew = [];
    arrOld.forEach(item => {
        arrNew.push(item.replace('-',':'));
    });
    let newStr = arrNew.join('\n');
    // //5.写出
    // fs.writeFile('./files/成绩-ok.txt',newStr,function(err){
    //     if(err){
    //         return console.log('写入失败!');
    //     }
    //     console.log('写入成功!');
    // })

    //__dirname   表示当前文件所处的目录
    console.log('---->' + __dirname);
    //5.写出
    fs.writeFile(__dirname + '/files/成绩-ok.txt',newStr,function(err){
        if(err){
            return console.log('写入失败!');
        }
        console.log('写入成功!');
    })

})

四、path

1.path模块概述

path模块是Node.js官方提供的,用来处理路径的模块。它提供了一系列方法和属性,用来满足用户对于路径处理的需要。

  • path.join():用来将多个路径片段拼接成一个完整路径的字符串
  • path.basename():用来从路径字符串中,将文件名解析出来

2.path.join

用来将多个路径片段拼接成一个完整路径的字符串

2.1 语法

javascript 复制代码
path.join([...paths])
  • ...paths: 路径片段序列
  • 返回值
javascript 复制代码
//1.引入模块
const fs = require('fs');
const path = require('path');


const pathStr = path.join('/a','/b/c','../../','./d','e');
console.log(pathStr); //   \a\d\e

// fs.readFile(__dirname+'/files/1.txt','utf8',function(err,dataStr){
//     if(err){
//         return console.log('读取文件失败!'+err.message);
//     }
//     console.log(dataStr);
// })

fs.readFile(path.join(__dirname,'./files/1.txt'),'utf8',function(err,dataStr){
    if(err){
        return console.log('读取文件失败!'+err.message);
    }
    console.log(dataStr);
})

注意:今后凡涉及到路径拼接的操作,都使用path.join()方法进行处理,不要直接使用+号拼接

3.path.basename()

用来从路径字符串中,将文件名解析出来

javascript 复制代码
//1.引入模块
const path = require('path');

//定义文件的存放路径
const fpath = 'a/b/c/index.html';
const fullName = path.basename(fpath);
console.log(fullName); //index.html

const nameWithoutExt = path.basename(fpath,'.html');
console.log(nameWithoutExt); //index

4.path.extname()

可以获取路径中的扩展名部分

javascript 复制代码
//1.引入模块
const path = require('path');

//定义文件的存放路径
const fpath = 'a/b/c/index.html';
const fext = path.extname(fpath);
console.log(fext); //.html

五、模块化

1.模块化的概念

模块化是指解决一个复杂问题的时候,自顶向下逐层把系统分为若干模块的过程,对于整个系统来说,模块是可组合,分解和更换的单元。

例如小霸王游戏机中的游戏卡

编程领域中的模块化:就是遵守固定的规则 ,把一个大文件 拆分成独立并且相互依赖的多个小模块。

好处:

  • 提高了代码的复用性
  • 提高了代码可维护性
  • 实现按需加载

2.模块化的规则

规则:就是对代码进行模块化拆分与组合的时候,需要遵守的规则

Node.js中模块来源不同,可以分为三大类

  • 内置模块(就是Node.js官方提供的,如:path、fs)
  • 自定义模块(用户可以自己创建模块)
  • 第三方模块(由第三方开发出来的模块,并非官方的内置模块,也不是用户自定义的模块)
加载

使用强大的require()方法,可以加载内置模块,用户自定义模块和第三方模块

3.自定义模块

3.1 模块化的作用域

防止全局变量污染的问题

javascript 复制代码
const username = '张三';

function sayHello(){
    console.log('大家好,我是'+username);
}
javascript 复制代码
//引入自定义的模块
const hsy = require('./09模块的作用域');

//输出的是{}对象
//无法访问到09模块的作用域.js模块中的私有成员
console.log(hsy);

3.2 向外共享模块作用域中的成员

module对象

在每个.js自定义模块中,都有一个module对象,它里里面就存储了和当前模块有关的信息

javascript 复制代码
console.log(module);
module.exports对象
javascript 复制代码
let username = '';
module.exports.username = '张三';

module.exports.sayHello = function(){
    console.log('大家好,我是'+username);
}
javascript 复制代码
//引入自定义的模块
const hsy = require('./09模块的作用域');

//输出的是{}对象
//无法访问到09模块的作用域.js模块中的私有成员
console.log(hsy);
hsy.sayHello();
console.log(hsy.username);
console.log(module);
共享对象
javascript 复制代码
module.exports.person = {
    username:'李四',
    age:20,
    eat:function(){
        console.log(`我的名字叫${this.username},今年${this.age},我会吃饭!`);
    }
};

3.3 exports对象

由于module.exports单词写起来比较复杂,为了简便向外共享成员代码,Nodes.js中提供了exports对象,

默认情况下exports和module.exports指向同一个对象。最终共享的结果,还是以module.exports指向对象为准。
10.exports对象.js

javascript 复制代码
const username = '张三';

//向module.exports对象中添加了一个属性,属性名叫username,赋值为'张三'
module.exports.username = username;
//向exports对象中添加属性age,赋值为20
exports.age = 20;
exports.sayHello = function () {
    console.log('大家好');
}

10.2test.js

javascript 复制代码
const m = require('./10.exports对象');

console.log(m);

3.4 exports和module.exports使用误区

**时刻谨记:**require() 模块时,得到的永远是module.exports指向的对象。

3.5 Node.js中的模块规范化

Node.js遵循了CommonJS模块化规范,CommonJS规定了模块化的特性和各模块之间如何相互依赖

  • 每个模块内部,module变量代表了当前模块
  • module变量是一个对象,它的exports是一个属性。moudle.exports是对外的接口
  • 加载某个模块,其实就是加载该模块的moudle.exports属性,require()方法用于加载模块。

六、npm与包

1、包

1.1 什么是包

Node.js中的第三方模块也叫包

1.2 包的来源

不同的Node.js中内置模块与自定义模块,包是由第三方个人或者是团队开发出来,免费供所有人使用

Node.js中的包都是免费开源的,不需要付费就可以免费下载使用。

1.3 为什么需要包

由于Node.js的内置模块仅仅是提供了一些底层的api,导致在基于内置模块进行项目开发的时候效率比较低。

包是基于内置模块封装出来的提供了更加高级,更加方便的api,极大的提高了开发效率。

1.4 从哪里下载包

npm.Inc公司提供了一个地址:http://registry.npmjs.org的服务器,来对外共享所有的包,我们可以从这个服务器取下载我们所需要的包

1.5 如何下载包

npm.Inc公司提供了一个包管理工具,我们可以使用这个包管理工具从 http://registry.npmjs.org/ 服务器中把需要的包下载到本地

这个包管理工具有个名字:Node Package Manager (简称:npm),这个包管理工具随着Node.js的安装会一起被安装到用户的电脑上

2.npm体验

2.1 传统写法

12.dataFormate.js

javascript 复制代码
//1.定义格式化时间的方法
function dataFormate(dataStr){
    //1.将日期字符串,转换成日期对象
    const dt = new Date(dataStr);
    //获取年月日,时分秒
    const y = dt.getFullYear();
    const m = padZero(dt.getMonth()+1);
    const d = padZero(dt.getDate());

    const hh = padZero(dt.getHours());
    const mm = padZero(dt.getMinutes());
    const ss = padZero(dt.getSeconds());

    return `${y}-${m}-${d} ${hh}:${mm}:${ss}`;
}

//定义补零函数
function padZero(n){
    return n>9 ? n : '0'+n;
}
//共享
module.exports = {
    dataFormate
}

12.2test.js

javascript 复制代码
const TIME = require('./12.dataFormate');

//调用方法进行日期格式化
const dt = new Date();
console.log(dt);

const newDT = TIME.dataFormate(dt);
console.log(newDT);

2.2 格式化时间的高级做法

  • 使用npm包管理工具,在项目中安装格式化时间包

    bash 复制代码
    npm i moment
  • 使用require() 导入格式化包

  • 参考npm中别人共享的包的api,进行调用

3.解决包下载速度慢的问题

在使用npm下载的时候,默认是http://registry.npmjs.org服务器在美国,所以速度会比较慢

原因:海底光缆

切换npm的下包镜像源

bash 复制代码
# 查看当前的下包镜像源
C:\Users\TR>npm config get registry
https://registry.npmjs.org/
#修改包镜像源
C:\Users\TR>npm config set registry=https://registry.npmmirror.com/
# 查看当前的下包镜像源
C:\Users\TR>npm config get registry
https://registry.npmmirror.com/

为了更方便切换包镜像源,我们可以安装nrm这个小工具利用nrm提供的终端指令可以方便的查看和切换下载源

七、数据库操作

1.连接数据库

2.创建数据库

javascript 复制代码
CREATE DATABASE IF NOT EXISTS db1;
USE db1;
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user`(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT NULL,
`password` VARCHAR(50) DEFAULT NULL,
`age` INT(8) DEFAULT NULL,
`address` VARCHAR(50) DEFAULT NULL,
PRIMARY KEY(`id`)
);

INSERT INTO `t_user` VALUES(NULL,'何思源','123456',23,'湖北省武汉市');
INSERT INTO `t_user` VALUES(NULL,'柯震东','123456',35,'中国香港');
INSERT INTO `t_user` VALUES(NULL,'房祖名','123456',32,'湖北省武汉市');
INSERT INTO `t_user` VALUES(NULL,'蔡徐坤','123456',26,'北京市');

3.查询数据

javascript 复制代码
//1.需要安装nodejs所需的mysql包
//  npm install mysql

//2.到mysql包
const mysql = require('mysql');

//3.创建连接对象,准备去连接mysql数据库(连接mysql数据库)
let client = mysql.createConnection({
    host: '117.50.197.206',  //mysql服务器所在的地址,如果服务器就在本机就写localhost,如果是远程服务器就服务器的ip地址
    user: 'root',  //数据库用户名
    password: 'H3iA7HMTbyLMrPHJ', //数据库的密码
    port: '3306',  //端口号
    database: 'db1'    //要连接的数据库的名字
});
//4.连接mysql数据库
client.connect(); 
//5.先选择要去使用的数据库
client.query('USE db1'); 
//6.查询
client.query('SELECT * FROM t_user',function(err,results,fields){
    if(err){
        throw err;//抛出异常,自己不处理,交给js去处理
    }
    if(results){
        console.log(results);
    }
});

查询后的格式化

javascript 复制代码
//6.查询
client.query('SELECT * FROM t_user',function(err,results,fields){
    if(err){
        throw err;//抛出异常,自己不处理,交给js去处理
    }
    if(results){
        //console.log(results);
        console.log(`学号\t姓名\t密码\t年龄\t家庭住址`)
        //遍历对象数组
        results.forEach(item => {
            console.log(`${item.id}\t${item.name}\t${item.password}\t${item.age}\t${item.address}`);
        });
    }
    //查询完了后就断开和服务器的连接
    client.end();//关闭连接
});

4.增加

javascript 复制代码
//1.需要安装nodejs所需的mysql包
//  npm install mysql

//2.到mysql包
const mysql = require('mysql');

//3.创建连接对象,准备去连接mysql数据库(连接mysql数据库)
let client = mysql.createConnection({
    host: '117.50.197.206',  //mysql服务器所在的地址,如果服务器就在本机就写localhost,如果是远程服务器就服务器的ip地址
    user: 'root',  //数据库用户名
    password: 'H3iA7HMTbyLMrPHJ', //数据库的密码
    port: '3306',  //端口号
    database: 'db1'    //要连接的数据库的名字
});
//4.连接mysql数据库
client.connect(); 
//5.先选择要去使用的数据库
client.query('USE db1'); 
//6.增加
let addSql = `INSERT INTO t_user VALUES(NULL,?,?,?,?)`; //执行添加的sql语句,?表示要加入的参数值
var addSqlParams = ['孙悟空', '123456', 18, '北京'];    //每个问好,所对应的值
client.query(addSql,addSqlParams,function(err,result){
    if(err){
        console.log('添加失败',err.message);
        return;
    }
    console.log('------INSERT------');
    console.log('INSERT ID:',result);

    //关闭连接
    client.end();
});

5.修改

javascript 复制代码
//1.需要安装nodejs所需的mysql包
//  npm install mysql

//2.到mysql包
const mysql = require('mysql');

//3.创建连接对象,准备去连接mysql数据库(连接mysql数据库)
let client = mysql.createConnection({
    host: '117.50.197.206',  //mysql服务器所在的地址,如果服务器就在本机就写localhost,如果是远程服务器就服务器的ip地址
    user: 'root',  //数据库用户名
    password: 'H3iA7HMTbyLMrPHJ', //数据库的密码
    port: '3306',  //端口号
    database: 'db1'    //要连接的数据库的名字
});
//4.连接mysql数据库
client.connect(); 
//5.先选择要去使用的数据库
client.query('USE db1'); 
//6.修改
let updateSql = `UPDATE t_user SET NAME=?,PASSWORD=?,age=?,address=? WHERE id=?`;
let updateSql_params = ['孙悟空', '123456', 18, '北京', 5];
client.query(updateSql,updateSql_params,function(err,result){
    if(err){
        console.log('修改失败',err.message);
        return;
    }
    console.log('------UPDATE------');
    console.log('UPDATE ID:',result);
    client.end(); //关闭连接
});

6.删除

javascript 复制代码
//1.需要安装nodejs所需的mysql包
//  npm install mysql

//2.到mysql包
const mysql = require('mysql');

//3.创建连接对象,准备去连接mysql数据库(连接mysql数据库)
let client = mysql.createConnection({
    host: '117.50.197.206',  //mysql服务器所在的地址,如果服务器就在本机就写localhost,如果是远程服务器就服务器的ip地址
    user: 'root',  //数据库用户名
    password: 'H3iA7HMTbyLMrPHJ', //数据库的密码
    port: '3306',  //端口号
    database: 'db1'    //要连接的数据库的名字
});
//4.连接mysql数据库
client.connect(); 
//5.先选择要去使用的数据库
client.query('USE db1'); 
//6.删除
let delSql = 'DELETE FROM t_user WHERE id=?'
let delSqlParams = [5];
client.query(delSql,delSqlParams,function(err,result){
    if(err){
        console.log('删除失败',err.message);
        return;
    }
    console.log('------DELETE------');
    console.log('DELETE ID:',result);

    //关闭连接
    client.end();
});

7.补充

query

这是客户端对象的一个方法,用于向数据库服务器发送 SQL 语句(或在某些数据库连接库中,发送特定于该库的查询指令,这些指令可能会被转换为对应的 SQL 语句在服务器端执行)并等待服务器的响应。通过调用这个方法,客户端可以与数据库服务器进行交互,执行各种数据库操作。

相关推荐
百***92027 分钟前
【MySQL】MySQL库的操作
android·数据库·mysql
q***76667 分钟前
Spring Boot 从 2.7.x 升级到 3.3注意事项
数据库·hive·spring boot
信仰_27399324320 分钟前
Redis红锁
数据库·redis·缓存
人间打气筒(Ada)29 分钟前
Centos7 搭建hadoop2.7.2、hbase伪分布式集群
数据库·分布式·hbase
心灵宝贝36 分钟前
如何在 Mac 上安装 MySQL 8.0.20.dmg(从下载到使用全流程)
数据库·mysql·macos
岁月宁静38 分钟前
AI 多模态全栈应用项目描述
前端·vue.js·node.js
格鸰爱童话1 小时前
next.js学习——react入门
学习·react.js·node.js
奋斗的牛马2 小时前
OFDM理解
网络·数据库·单片机·嵌入式硬件·fpga开发·信息与通信
忧郁的橙子.2 小时前
一、Rabbit MQ 初级
服务器·网络·数据库
杰杰7982 小时前
SQL 实战:用户访问 → 下单 → 支付全流程转化率分析
数据库·sql