Node.js
文章目录
一、Node.js概述
Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。
Node.js是一种运行在服务器端的JS环境。
下载方法
下载地址:https://nodejs.org/en/
中文网:https://nodejs.cn/
Node.js对比JS
- JS运行在客户端浏览器,有多种解释器,存在代码兼容性问题
Node.js运行在服务器端,只有一个解释器,不存在代码兼容性问题 - 两者都有相同的内置对象和自定义对象,有各自的宿主对象
- JS用于操作网页元素,实现用户交互;
Node.js用于服务器端开发。例如操作数据库,调用其它的服务器…
官网:www.nodejs.org
国内镜像:www.nodejs.cnNode.js运行方式
1.脚本模式
node // 拖拽产生文件的路径
2.交互模式
node // 灰尘 进入到交互模式
ctrl + d // 或者 按两次 ctrl + c // 提出交互模式
Node.js特点
单线程运行逻辑
二、全局对象
1.global 对象
可以查看一个变量或者一个函数是否为全局的
在交互模式下,属于全局作用域,全局变量和全局函数可以通过global访问
var a = 1 // 全局变量
function fn() { // 全局函数
return 2
}
global.a
global.fn()
在脚本文件下,属性模块作用域,变量和函数都是局部的
JS下全局对象global名称为:window
2.console对象
用于输出到控制台
console.log(1); // 输出日志
console.info(2); // 输出消息
console.warn(3); // 输出警告
console.error(4); // 输出错误
console.time('for');// 开始计时
console.timeEnd('for');// 结束计时
注意事项:开始计时和结束计时的参数要保持一组
练习:统计出来for while do-while循环100000次的耗时
3.process对象
进程:计算机上任何的软件运行都会占用一定的资源
process.arch // 查看当前服务器的CPU架构(32、64)
process.platform // 查看服务器的操作系统
process.pid // 查看当前进程的编号
process.kill() // 结束指定编号的进行
4.Buffer对象
缓冲区,是内存中一块区域,用于临时存储数据
// 从内存分配空间作为缓冲区,存储一个值
// 单位是字节 字母一个字节 一个汉字占三个字节
var buf = Buffer.alloc(9,'abc新哥');
console.log(buf); // <Buffer 61 62 63 64 65>
console.log(buf.toString()); // 将一组Buffer数据转为字符串
三、模块
每一个JS文件就是模块,模块内部封装了一组功能,会形成一个独立的作用域,变量和函数都不能被外部直接访问。
- require: 是一个函数,用来引入其它的模块,得到暴露的对象
- module.exports: 是模块暴露的对象,默认是一个空对象,如果想让外部使用哪个功能,就需要添加到这个对象
主模块
// 引入功能模块
// 同一级路径 加 ./
// 引入成功一个模块后,得到的是另一个模块暴露的对象
var obj = require('./08_2.js');
console.log(obj.myA);
功能模块
console.log('引入了功能模块');
var a = 1;
function fn() {
return 2;
}
// 每个模块中都有一个暴露的对象,默认是空对象的
// 如果要让外部使用哪一个,就需要把它放入到暴露对象中
module.exports = {
myA: a,
}
局部变量
- _dirname 获取当前模块的绝对路径
- _filename 获取当前模块的绝对路径+模块名称
模块分类
模块分为自定义模块、核心模块、第三方模块
以路经开头 | 不以路经开头 | |
---|---|---|
文件模块 | require(’ ./circle.js ') 用于引入自定义模块 | |
目录模块 | require(’ ./02_2 ') 首先会到目录中查找说明文件 package.json中main属性对应的文件,如果文件找不到会自动寻找index.js | require(‘04_2’) 首先会到当前目录下的node_modules目录中寻找;如果找不到会不断的往上一级的node_modules目录中寻找;用于引入第三方模块 |
四、包和NPM
- CommonJS模块:是一种模块化规范,Node.js就是采用了这个模块化规范
require、module.exports都是基于CommonJS模块规范。
- 包:package,就是第三方模块,以目录模块的形式出现
- NPM:管理包的工具模块,例如:下载安装、上传、更新、卸载…
Node.js安装的过程已经附带安装
npm -v
准备工作:确保命令行指向到要下载的目录
NPM网址:www.npmjs.com
NPM命令
npm init -y
初始化一个项目描述文件,名称为 package.json;可以用来记录下载安装的包
npm install 模块名称
下载安装指定的模块,会将所有的包放入到node_modules目录,在package.json值记录下载的当前这个包;会生成package-lock.json,会记录下载安装的所有的包 (包括依赖的包)
npm install
自动下载安装package.json记录的包
设置中国镜像: npm set registry https://registry.npmmirror.com
查看当前镜像: npm get registry
五、URL
URL:统一资源定位器,互联网上的任何资源都有对应的URL,用来标识资源,例如:网页、图片、视频、声音…
https://www.jd.com/products.html?a=1&b=2
协议 域名 资源路径 查询参数
协议:用来传输资源
域名(主机):用来查找服务器
资源路径:表示要请求的服务器端文件路径
查询参数:客户端往服务器传递的值,例如:传递搜索的关键字、用户名、密码; 格式为: 参数1=参数值1&参数2=参数值2
https:443 http:80
加了ssl保密
new URL() // 将一个URL转为对象,可以获取各个部分
searchParams // 获取对象中查询参数的部分
get('参数名') // 获取查询参数中参数名对应的参数值
练习:获取以下URL中查询参数中的值,最后打印以下格式
https://www.tmooc.cn/course/web.html?cid=2212&cname=Nodejs
‘班级名称:WEBxxxxx 课程名称:xxxx’
var str = 'https://www.tmooc.cn/course/web.html?cid=2212&cname=Nodejs';
// 将URL转为对象
var obj = new URL(str);
// 获取查询参数
var qs = obj.searchParams;
console.log(`班级名称:WEB${qs.get('cid')} 课程名称:${qs.get('cname')}`
四、定时器
1.一次性定时器
// 开启
var timer = setTimeout(回调函数, 间隔时间); // 当前时间到了,会调用一次回调函数
// 清除
clearTimeout(timer);
2.周期性定时器
// 开启
var timer = setInterval( () => {
console.log('哈哈哈');
},3000);
// 清除
clearInterval(timer);
3.立即执行定时器
setImmediate(回调函数) / clearImmediate()
process.nextTick(回调函数) // 没有清除的方法
定时器执行逻辑:所有定时器中的回调函数都是放在主线程后的事件(任务)队列中执行,不会阻止主线程中后续代码执行
五、文件系统模块
属于是核心模块
文件分为目录形式和文件形式
const fs = require('fs');
1.查看文件状态
var s = fs.statSync('文件的路径');
s.isFile(); // 是否为文件
s.isDirectory(); // 是否为目录形式
fs.stat('文件的路径',回调函数);
2.同步方法和异步方法
- 同步方法:在主线程中执行,会阻止主线程后续代码的执行;通过返回值获取结果
- 异步方法:在一个独立的线程执行,不会阻止主线程后续代码的执行;通过回调函数获取结果
// 异步执行
// 会在一个新的线程执行
fs.stat('01_homework.html', (err, r) => {
// err可能产生的错误结果
if(err) {
throw err
}
// r 成功的结果
console.log(r);
});
console.log('结束');
清空写入文件
writeFileSync('文件的路径',写入的值);
writeFile('文件的路径',写入的值,回调函数);
如果文件不存在,会先创建文件然后写入值
如果文件已经存在,会清空文件中的内容然后写入值
追加写入文件
appendFileSync('文件的路径',写入的值);
appendFile('文件的路径',写入的值,回调函数);
如果文件不存在,会先创建文件然后写入值
如果文件已经存在,会在文件的末尾追加写入值
读取文件
readFileSync('文件路径');
readFile('文件路径',回调函数);
读取结果的格式为Buffer
删除文件
unlinkSync('文件的路径');
unlink('文件路径',回调函数);
检测文件(目录)是否存在
existsSync('文件的路径');
文件流
createReadStream( ) 创建可读取的文件流
createWriteStream( ) 创建可写入的文件流
// 引入文件系统模块
const fs= require('fs');
// 以流的方式读取文件
var rs = fs.createReadStream('banner.jpg');
// 创建写入的流,可以流的方式可以写入文件
var ws = fs.createWriteStream('1.jpg');
// 将读取的流添加到写入的流
rs.pipe(ws);
Node.js事件监听
on(‘事件名称’,回调函数); 一旦监听到事件后,会调用回调函数,事件名称是固定的字符串
// 绑定事件,监听是否有数据流入到内存
rs.on('data',(c) => {
// c 表示每次读取的数据
console.log(c);
});
六、HTTP协议
1.通用头信息
请求的URL:要请求的服务器端资源
请求的方式:对资源的操作方式 例如:GET/POST
响应的状态码
1**:接受到部分请求,还在继续…
2**:成功的响应
3**:响应的重定向,会请求另一个资源
4**:客户端错误
5**:服务器端错误
2.响应头信息
服务器做出的是响应
Content-Type:设置响应的内容类型,解决中文乱码 text/html;charset=utf-8
Location:设置要跳转的URL,通常配合状态码302使用
七、HTTP模块
是Node.js提供的一个核心模块,可以用来创建WEB服务器
createServer( ) 创建WEB服务器
listen( ) 设置端口
res 响应对象
res.statusCode 设置响应的状态码
res.setHeader ( ) 设置响应的头信息
res.write( ) 设置响应到客户端的内容
res.end( ) 结束响应
例子:
// 引入http模块
const http = require('http')
// 创建WEB服务器
const app = http.createServer()
// 给服务器设置端口
app.listen(3000, () => {
console.log('服务器启动成功')
})
// 域名、IP地址
// 给服务器绑定事件,监听客户端的请求
app.on('request',(req,res) => {
console.log('有一个请求过来了');
// req 请求的对象
// res 响应的对象
// 设置响应头信息中,内容类型
res.setHeader('Content-Type','text/html;charset=utf-8');
// 设置响应的内容
res.write('WEB前端2212');
// 结束响应
res.end();
});
## 八、express框架
基于Node.js平台,快速、开放、极简的WEB开发框架。
属于是第三方模块,需要先去下载安装
npm install express
网址:www.expressjs.com.cn
创建WEB服务器
开局内容
const express = requrie('express')
//创建WEB服务器
const app = express()
//设置端口
app.listen(3000)
路由
用来处理特定的请求,就是设置客户端请求和服务器端响应之间的对应关系
路由包含请求的URL、请求的方式、回调函数
app.请求的方式('请求的URL', 回调函数)
res 响应对象
- res.send() 设置响应的内容并结束
- res.redirect() 设置响应的重定向,会跳转到* 另一个URL
- res.sendFile() 设置响应的文件,文件必须使用绝对路径 __dirname
req 请求对象 - req.url 获取请求的URL
- req.method 获取请求的方式
- req.query 获取请求的URL中的查询参数,格式为对象
- req.body 获取post传递的参数
## 路由器
将多个路由写入到一个独立的模块中,便于管理路由 ——— 模块化开发
路由器模块
// 1.引入express
// 2.创建路由器对象
const router = express.Router();
// 3.往路由器对象添加路由
// 4.暴露路由器对象
module.exports = router;
WEB服务器
// 1.引入路由器模块
// 2.挂载路由器,路由器模块下的路由成为WEB服务器的一部分
// 添加的前缀可以给所有的路由的URL添加前缀
app.use(要添加的前缀,引入的路由器);
九、中间件
用于拦截对服务器端的请求
express下中间件分为 应用级中间件 路由级中间件 内置中间件 第三方中间件 错误处理中间件
1.应用级中间件
本质上是一个函数,一旦拦截后会调用这个函数
functoon fn(req,res,next) {
next(); // 往后执行,可能是下一个中间件,或者路由
}
app.use('/list',fn); // 拦截特定的请求
app.use( fn ) // 拦截所有的请求
2.路由级中间件
就是路由器的使用,在拦截到URL以后,会指定的路由器下寻找路由
app.use(拦截的URL,路由器);
3.内置中间件
express提供的中间件就是内置中间件,可以直接使用
(1) 将POST传参转为对象
app.use(express.urlencoded({
extended: true;
}) )
(2) 托管静态资源
app.use( express.static('目录的路径') );
4.第三方中间件
属于第三方模块形式,使用之前需要先去下载安装
5.错误处理中间件
用于后期项目中
十、mysql模块
增删改查
insert into 数据表 values(一组值,....);
delete from 数据表名称 where 条件;
update 数据表名称 set 列名称=值,列名称=值 where 条件;
select * from 数据表名称 where 条件 order by 排序 limit 开始的值,数据量;
下载安装命令
mysql模块是Node.js下专门用于操作mysql数据库的模块,属于第三方模块,需要先去下载安装
npm install mysql
createConnerction() // 创建mysql的连接对象
connect() // 测试mysql的连接
query(SQL命令,[要过滤的值],回调函数) // 执行SQL命令,如果有需要往SQL命令中拼接的值需要先进行过滤,最后通过回调函数来获取结果
multipleStatements: true // 开启一次执行多个SQL命令
SQL注入
SQL注入: 在让用户提供值的位置,破坏了原来的SQL命令,加入新的条件或者SQL命令。
防止SQL注入: 先对用户提供的值进行过滤,过滤后再去拼接到SQL命令
占位符(?): 过滤后的值会自动替换占位符,完成拼接。
SQL命令 | 结果 |
---|---|
查询命令 | 数组 |
删除命令 | 对象,通过affectedRows属性判断是否删除成功 |
插入命令 | 对象,insertId插入第几行 |
修改命令 | 对象,通过changeRows属性判断是否修改成功 |
创建连接池
创建连接池:可以一次创建一组连接,每次执行SQL命令,就会从连接池中获取一个连接,执行完命令以后再把连接还回去。
createPool( ) 创建连接池对象,默认连接数量是15
getConnection( ) 从连接池中获取一个连接
query( ) 执行SQL命令
release( ) 释放连接,会把连接归还到连接池
十一、接口(API)
接口:就是后端为前端提供的动态资源;
Node.js下每一个路由都会产生一个对应的接口
1.返回结果
格式上要求是JSON对象的形式,包括状态码、消息说明
JSON: 字符串对象(把对象放入到字符串中),属性名必须是双引号,属性值是字符串也必须是双引号
{
"code": 200,
"msg": "员工添加成功",
"data": 需要返回的数据
}
2.接口地址
3.请求方式
- get 用于获取资源(查询数据)
- post 用于新建资源(插入数据)
- delete 用于删除资源(删除数据)
- put 用于修改资源(修改数据)
4.传递参数
- get/delete 选择get传递 (可选params传递)
- post/put 选择post传递
5.错误处理中间件
在所有路由器(路由)后添加,拦截所有路由中出现的错误
app.use( (err, req, res, next) => {
// err 路由传递的错误
res.send({code: 500, msg: '服务器端错误'})
} )
使用express项目生成器搭建项目(脚手架) (补充)
文档:https://www.expressjs.com.cn/starter/generator.html
生成项目
npx express-generator
npx会临时安装一个包,使用完会自动卸载
npm install
会安装package.json中记录的依赖包
npm start
启动项目,运行的是package.json中scripts下start对应的命令
或者 node bin/www
启动后服务器占用的端口是3000
十三、pm2(补充)
是Node.js的进程管理器,可以简化node任务管理
安装
pm2属于Node.js下的第三方模块
全局安装pm2
npm install -g pm2
查看是否安装了pm2
pm2 -v
使用pm2启动一个node项目
–watch 监听程序源文件的编号,一旦发生变化会自动重启(热启动)
pm2 start 项目的启动文件 --name 自定义名称 --watch
查看当前node进程列表
pm2 list
停止一个node进程
pm2 stop [进程名] | [进程id]
重启进程
pm2 restart [进程名] | [进程id]
删除进程
pm2 delete [进程名] | [进程id]
查看日志
pm2 logs 所有日志
pm2 logs [进程名] | [进程id]