Node.js笔记

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.cn

    Node.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.jsrequire(‘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

其他npm命令

五、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]
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值