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 语句在服务器端执行)并等待服务器的响应。通过调用这个方法,客户端可以与数据库服务器进行交互,执行各种数据库操作。

相关推荐
java_heartLake7 小时前
PostgreSQL数据库参数调优实践
数据库·postgresql·调优
xnuscd9 小时前
Milvus概念
数据库·学习·mysql
代码欢乐豆9 小时前
软件工程第13章小测
服务器·前端·数据库·软件工程
小gpt&10 小时前
实现qt拖拽显示或者播放
数据库·qt·音视频
望获linux10 小时前
在 ARM 平台上如何实现Linux系统的1秒启动
linux·服务器·开发语言·数据库·操作系统·嵌入式操作系统·arm平台
漫天转悠10 小时前
MySQL 七种JOIN连接详解
数据库·mysql
尘浮生10 小时前
Java项目实战II基于Java+Spring Boot+MySQL的智能停车计费系统(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·mysql·微信小程序·maven
蒜蓉大猩猩10 小时前
Vue.js --- Vue3中其他组合式API
前端·javascript·vue.js·前端框架·node.js·html
quintin-lee10 小时前
PostgreSQL中的内存上下文管理
数据库·postgresql
蚂蚁在飞-11 小时前
一个高度可扩展的 Golang ORM 库【GORM】
数据库·oracle·golang