一、认识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环境安装
如果希望通过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的服务器,来对外共享所有的包,我们可以从这个服务器取下载我们所需要的包
- 从https://www.npmjs.com/ 搜索自己想要的包
- 从 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包管理工具,在项目中安装格式化时间包
bashnpm 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 语句在服务器端执行)并等待服务器的响应。通过调用这个方法,客户端可以与数据库服务器进行交互,执行各种数据库操作。