1. 初识node.js
- Node.js是一个基于chrome V8引擎的javaScript运行环境。
- 浏览器中js的运行环境 = chrome V8引擎 + web API(BOM、DOM、ajax等)。
- Node.js中js的运行环境 = V8引擎 + 内置API(fs、path、http、js内置对象等)。
- 终端快捷键:tab(补全路径)、esc(清空当前已输入的命令)、 clear(清空终端)。
2. fs文件模块系统
-
fs模块是node.js官方提供的、用来操作文件的模块。
-
fs.readFile()
:读取指定文件的内容:const fs = require('fs') fs.readFile(path, 'utf8', function(err, result) { if(err){ return console.log('读取文件失败',err.message) } return console.log('读取文件成功,内容是',result) })
-
fs.writeFile()
:向指定文件中写入内容:const fs = require('fs') fs.writeFile(path, 写入信息, function(err) { if(err){ return console.log('写入文件失败',err.message) } console.log('写入成功') })
-
__dirname
:表示当前文件所在的目录
3.path路径模块
-
path.join()
:用来将多个路径片段拼接成一个完整的路径字符串。const path = require('path') const pathStr = path.join(__dirname, './file/1.txt')
-
path.basename(path, [扩展名])
:用来从路径字符串中将文件名解析出来(加上扩展名之后只能拿到文件的名称,不能拿到扩展名)。const path = require('path') const fpath = '/a/b/c/index.html' var fullName = path.basename(fpath) console.log(fullName)//输出index.html
-
path.extname()
:可以获取路径中的扩展名部分。path.extname(path) //得到路径的扩展名
4. http模块
-
http模块:是node.js官方提供的、用来创建web服务器的模块。
-
客户端和服务器:在网络节点中,负责消耗资源的电脑叫做客户端;负责提供资源的电脑叫做服务器。(服务器和普通电脑的区别就是,服务器安装上了web服务器软件)。
-
ip
-
域名
-
DNS服务器
-
端口号:每个端口号只能对应一个web服务;实际应用中,URL中的80端口可以被省略。
-
创建基本的web服务器步骤:
导入http模块
const http = require('http')
调用createServer方法来创建web服务器实例
const server = http.createServer()
为服务器实例绑定request事件,监听客户端请求;
server.on('request', (req, res) => { })
-
req:请求对象(req.url和req.method)
-
res:响应对象(res.end()向客户端发送指定内容,并结束这次请求的处理过程)
res.setHeader('Content-Type', 'text/html; charset=utf-8') //处理中文乱码
-
调用服务器实例的
.listen()
方法来启动web服务器实例server.listen(80,()=>{ console.log('server running at http://127.0.0.1') })
-
5. 模块化
-
模块化规范好处:提高代码的复用性,可维护性,实现按需加载。
-
Node.js中模块的分类:内置模块、自定义模块、第三方模块(包)。
-
加载模块:
const custom = require('path')
,用require方法导入一个自定义模块的时候,默认导入的是exports对象。 -
模块作用域
-
module对象:存储了和当前模块有关的信息 ,默认情况下,
module.exports = {}
-
commonJS规范:规定了模块的特性和各模块之间如何依赖
- 每个模块内部,module变量代表当前模块
- module.exports是对外的接口
- require方法用于加载模块
-
npm
- node_modules文件夹:用来存放所有已安装到项目中的包。
- package-lock.json:记录node_modules目录下每一个包的下载信息(包的名字、版本号、下载地址)。
- package.json:包管理配置文件(项目的名称、版本号、描述、包的分类)。
- Dependencies:记录
npm install
安装了哪些包。 - devDependencies:开发依赖。
- 包的语意:@大版本.功能版本.bug修复(@2.24.1)。
- 镜像:一种文件存储形式,一个磁盘上的数据在另外一个磁盘上存在一个完全相同的副本即为镜像。
- 命令:
npm init -y
:在执行命令所处的目录中快速创建package.json包管理配置文件。
npm install
:npm包管理工具会自动把包的名称和版本号记录到package.json中。
-
模块的加载机制:
模块在第一次加载后会被缓存,优先从缓存中加载。
6. express
-
概念:express是基于node.js平台,快速、开放、极简的web开发框架(用来创建web服务器)。
-
服务器:web网站服务器、API接口服务器。
-
创建express服务器:
const express = require('express') const app = express() app.listen(80, () => { })
-
监听get请求:
get('path', (req, res) => { })
-
监听post请求:
post('path', (req, res) => {})
req.body来拿post请求的数据
-
将内容响应给客户端:
res.send()
-
缓存:数据交换的缓冲区,是使用频繁数据的临时地方;当用户查询数据时,首先在缓存中寻找,如果找到了直接执行。
-
获取url中所携带的参数:
一般参数:
req.query
动态参数:req.params
-
托管静态资源:
express.static(path)
:创建一个静态资源服务器。挂载路径前缀:
app.use('/public',express.static('public'))
-
nodemon:监听项目文件的变动,自动重启项目。
-
express路由(客户端的请求与服务器处理函数之间的映射关系)= 请求的类型 + 请求的url地址 + 处理函数:
app.method(url, function() { })。
-
创建模块化路由:
const express = require('express') const router = express.Router() //创建路由对象 router.get('/user/list', (req, res) => { //挂载具体的路由 res.send('get user list') }) module.exports = router //向外导出路由对象
-
注册使用路由模块:
const router = require('./router.js') //导入路由模块 app.use(router) //注册使用路由 app.use('/api',router) //eg:为路由模块添加前缀
-
中间件:
app.use():注册全局中间件
中间件的分类:
-
应用级别中间件:绑定到app实例上的中间件
app.use() \ app.get() \ app.post()
-
路由级别中间件:绑定到express.Router()实例上的中间件
express.Router()
-
错误级别中间件:有四个参数:
(err, req, res, next)
-
express内置中间件:
express.static \ express.json \ express.urlencoded
-
第三方中间件
-
-
使用express写接口
get和post
-
接口跨域:
CORS(跨域资源共享,由一系列http响应头组成,服务端开启)中间件解决跨域
jsonp接口:浏览器通过script标签的src属性,请求服务器上的数据,同时,服务器返回一个函数的调用。仅支持get请求。
7. 数据库
-
数据库(mysql):用来组织、存储、管理数据的仓库。
-
登陆数据库:
mysql -uroot -p admin123
-
数据库可视化管理(mySQLWorkBench):
8. 前后端身份认证
- web开发模式:服务器端渲染模式、前后端分离模式。
- 身份认证:
- 服务端渲染:session认证机制
- 前后端分离:JWT认证机制
- cookie身份认证:存储在用户浏览器中一段不超过4KB的字符串
- 特点:自动发送、域名独立、过期限制、4KB限制。)
- Session身份认证:
- JWT(json web token)认证机制:
- 用户的信息通过token字符串的形式,保存在客户端浏览器中,服务器通过还原token字符串的形式来认证用户的身份。可以抵抗csrf,可以实现cors
- token组成部分:Header(头部).Payload(有效荷载:就是加密后真正的用户信息).Signature(签名)
9. 补充
- CSRF(跨站请求伪造):是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
- XSS(跨站脚本)攻击:恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
- 反射型XSS:<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
- 存储型XSS:<持久化> 代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。
- DOM型XSS:基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。
- CORS(跨域资源共享):整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。