Node.js
node基础
一、Node.js简介
1.node的简介
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
Node.js使用的是CommonJs规范。
Node.js主要应用于服务端,主要用来操作文件和创建http服务及进程操作。
(tip:是 Node 选择了 JavaScript,不是 JavaScript 发展出来了一个 Node。)
2.NodeJs安装
下载最新版本号:14.5.0
运行 node 文件名.js
常用命令
cls 清屏
dir 列出当前目录下的所有文件
cd 目录名 进入到指定的目录
md 目录名 创建一个文件夹
rd 目录名 删除一个文件夹(只能删除空文件夹)
cd … 返回上层目录
cd 命令,就是change directory的缩写,表示更改当前目录
3.Node.js的特点
单线程、 非阻塞 I/O 机制、事件环机制
tip:请不要使用var定义变量以避免引入全局变量,因为全局变量会污染命名空间,提高代码的耦合风险。
二、Buffer
1.概念
Buffer模块是Node的核心类库,提供了一种原始的数据存储方法(即二进制形式存储数据)。注:虽然Buffer的存储方式为二进制,但其输出的表现形式为十六进制。
2.初始化
▲Buffer.alloc
Buffer.alloc(size[, fill[, encoding]]),创建一个指定大小的Buffer,如果没有设置 fill,则默认填满 0;
let buf1 = Buffer.alloc(3);
let buf2 = Buffer.alloc(3,”q”,”utf-8”)
▲ Buffer.from
Buffer.from(string[, encoding]) 将一个字符串转换为buffer
let buf3 = Buffer.from("www")
3.Buffer 缓存区的输出
▲ buf.toString()
buf.toString([encoding[, start[, end]]]) 将缓冲区中的数据以字符串的形式读取
const buf = Buffer.from(‘I am teacher’, ‘UTF-8’);
console.log(buf.toString(‘hex’));
console.log(buf.toString(‘base64’));
console.log(buf.toString(utf8));
▲buf.write()
buf.write(string[, offset[, length]][, encoding])将字符串写入缓冲区
let buf = Buffer.alloc(256);
let len = buf.write(“I am teacher”);
console.log(“写入字节数 : “+ len); // 写入字节数 : 14
▲buf.toJSON()
buf.toJSON()将缓冲区中的数据转换为Json格式
const buf = Buffer.from(“12345”);
const json = buf.toJSON()
console.log(json);// 输出: { type: ‘Buffer’, data: [ 49, 50, 51, 52, 53 ] }
4.将缓存区进行合并
Buffer.concat(list[, totalLength])合并缓存区并生成一个新的缓存区,list合并的列表(数组形式)
var buffer1 = Buffer.from((‘大家好’));
var buffer2 = Buffer.from((‘I am teacher’));
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log(“buffer3 内容: “ + buffer3.toString());
5.返回缓存区的长度
buf.length 返回缓存区被占用的长度
三、MIME的定义
MIME是多用途互联网邮件扩展类型。这是HTTP协议中用来定义文档性质及格式的标准。服务器通过MIME告知响应内容类型,而浏览器则通过MIME类型来确定如何处理文档。
MIME的常见类型
- 超文本标记语言文本 .html text/html
- xml文档 .xml text/xml
- XHTML文档 .xhtml application/xhtml+xml
- 普通文本 .txt text/plain
- RTF文本 .rtf application/rtf
- PDF文档 .pdf application/pdf
- PNG图像 .png image/png
- Microsoft Word文件 .word application/msword
- GIF图形 .gif image/gif
- JPEG图形 .jpeg,.jpg image/jpeg
- css文件 .css text/css
- Json文件 .json application/json
- JS文件 .js text/JavaScript
express框架
一、express的简介
express是基于nodejs开发的一个框架,便于加快项目开发,有利于团队协作
二、express的使用
1.express的初体验
(1).引入模块
var express=reuqire(‘express’)
(2)创建web服务器
var app=express();
(3).路由
app.get(’/ ',function(req,res){
send();响应字符串,自动识别
end();响应字符串,会乱码
render();响应字符串,自动识别,只能打开指定文件字符串并相应,只能配合模板引擎使用
})
(4).启动服务
app.listen(9000,function(){
})
2.express 引入模板 ejs
●ejs简介
ejs是一个Javascript模板库, 用来从JSON数据中生成HTML文件,特点是它是纯JavaScript,便于快速开发,执行迅速,语法简单,同时支持前后端环境,更贴近于HTML标签语法
●步骤一安装
【art模板安装】
npm install art-template,npm install express-art-template
【ejs模板安装】
npm install -g express-generator
express --view=ejs [文件名]
//在view文件夹中以HTML文件显示在app.js文件设置设置
app.engine(‘html’,require(‘ejs’).renderFile);
app.set(‘view engine’, ‘html’);
//view文件中以ejs结尾属性,在app.js文件设置设置
app.set(‘view engine’, ‘ejs’);
●ejs模板文件内标签定义
<% %> 用于流程控制,无输出
<%= %>输出数据到模板(输出是转义HTML标签)
<%# %>ejs的注释,不执行不输出,使用了ejs模板,HTML文件在模板中原先的注释不能使用须使用ejs的注释
<%- include %>包含,eg. <%-include(‘footer.html’)%>
三.路由
◆请求报文和响应报文
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eEBl6KBF-1596450463644)(C:\Users\thinkpad\Desktop\前端\搜狗截图20200723234612.png)]
HTTP 请求报文由请求行、请求头部、空行 和 请求包体 4 个部分组成;
HTTP 响应报文由状态行、响应头部、空行 和 响应包体 4 个部分组成;
◇http请求类型:
get、post、put、delete
◇app.http请求类型(请求路径/:参数名/…,回调)
特性:get只能接受get请求,post只能接受post请求,all都可以接受
◇app.use
匹配所有类型请求,use非完全匹配(只需要URL前面匹配请求路径即可匹配)
◆中间件
定义
中间件是http请求中的过滤层
中间件是可以访问请求对象,响应对象以及next应用程序请求-响应周期中的函数,使用app.use()来使用/定义中间件
(路由参数声明交给哪个方法处理,交给那个方法处理前,先交给另一个方法处理,在nodejs中用app.use调用)
路由中间件
中间件匹配成功后将不再继续匹配,如若想要继续,需要next();
中间件错误处理
404页面:上面都匹配不成功,最终走404中间件
错误统一处理:第一步回调函数加next,第二部next(err)
第三方中间件
cookie-parser:解析cookie
ejs:ejs模板
express-session:解析session
http-errors:错误中间件处理
Moment:日期时间处理
Morgan:日志打印
Multer:文件上传
Nodemon:热更新
config-lite: 读取配置文件
四.express 具体使用
1.cookie和session
◆cookie和session的安装
cookie:npm i cookie-parser
session:npm i express-session
◆cookie和session的区别
session是区别于数据库存在的一种服务器临时存储技术, 它主要存储一些无需持久化的数据, 比如临时的登录状态信息等
cookie是存在于浏览器上的一种浏览器本地存储的方式, 同域名下的cookie不同标签页可以共享, 默认过期时间是浏览器关闭时, 而且在进行http请求时, 会自动带上浏览器全部的cookie发给后台, 后台也可以获取cookie, 设置可以在响应时, 想浏览器中设置cookie。
◆cookie的用法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JuFx22Iq-1596450463652)(C:\Users\thinkpad\AppData\Roaming\Typora\typora-user-images\image-20200727200103780.png)]
var express = require('express');//引入express模块
var cookieParser = require('cookie-parser');
var app=express();//创建app对象
app.use(cookieParser('aaa'));//使用cookie-parser中间件,传入aaa签名进行加密
res.cookies('key','value',option)
option 要求是json格式,可选项是
domain:域名
expires:过期时间(秒)
maxAge:最大失效时间(毫秒)
secure:true:cookie在http中是无效的,在HTTPS才有效
path:表示路由路径,表示匹配对应的路径给这个发送cookie
httpOnly:默认值为false,true:客户端将无法通过document.cookie读取到cookie信息,防止 XSS 攻击
signed:是否加密,true:加密,后续需要使用res.signedCookies访问,false:未加密则用 res.cookies 访问
获取cookie res.cookies.key
清除cookie res.clearCookie(键)
在express中如何给cookie设置过期时间
通过设置expires和max-age,expires是日期时间类型,max-age是number类型
Res.cookie(name,value,{
expires : new Date(Date.now()+1000*60)
maxAge : 1000*60
})
◆session的用法
var session=require('express-session')
//初始化session
app.use(session({
secret:'str',//加密存储
resave:false,//客户端并行请求是否覆盖:true是;false否
saveUninitialized:true//初始化session存储
}))
option的常用可选项有
name:用来设置在res中的或是来自req的cookie的session id的名字
resave:强制将会话保存回会话存储,即使在请求期间从未修改过会话也是如此。(默认值为true,但已弃用默认值,因为将来会更改默认值。)建议设置为false
cookie:设置session id为cookie的对象,
cookie:{
path: '/',
httpOnly: true,
secure: false,
maxAge: null
}
secret(必要的):用于加密存储
saveUninitialized:强制将“未初始化”的会话保存到存储中。选择false对实现登录会话,减少服务器存储使用或遵守设置cookie之前需要获得许可的法律很有用。 选择false还将有助于解决争用条件,即客户端在没有会话的情况下发出多个并行请求。默认值为true,但已经弃用默认值,可依旧案例选择;
设置:req.session.键=值
app.get('/set',function(req,res,next){
res.session.a=2;
})
获取:req.session.键
app.get('/get',function(req,res,next){
res.session.a;
})
清除:req.session.键=null
app.get('/del',function(req,res,next){
res.session.a=null;
})
2.get和post获取数据
get中 req.query获取;post中req.body获取
GET和POST提交的参数格式是Urlencoded格式的编码类型
request对象常用属性
req.body:用于获取post,put等请求的参数,配置express.json和express.urlencoded解析post请求的参数
req.params:用来获取路由动态参数中的内容
req.query:获取url中的查询字符串,一般用于解析get请求的参数,配置querystring中间件可以将urlencoded与json对象互转;
req.cookies:用于获取用户提供cookies内容,配置cookie-parser解析cookie
req.signedCookies:用于获取用户加密的cookies内容,配置cookie-parser解析signedCookies,需要提前设置加密的字符串
req.path:获取url请求中的路径,注意不是host,port或query,仅仅是路径,可以手动实现路由功能
response对象常用属性
res.cookie():给客户端设置cookie内容,如果是加密cookie则需要配置cookie-parser
res.clearCookie():清除cookie内容
res.set():设置响应head信息,如content-type,content-lenght等
res.end():结束请求响应循环
res.json():给客户端发送json数据
res.jsonp():给客户端发送jsonp数据,默认是名称callback
res.send():发送数据给客户端,可以是字符串,json对象或buffer
res.redirect():重定向页面,重定向请求
res.render():渲染指定模板给客户端
res.sendFile():将文件作为八位字节流发送
res.status():设置响应header状态码
res.sendStatus():同样是设置响应header状态码,它等同于send + status两个方法的链式操作
端设置cookie内容,如果是加密cookie则需要配置cookie-parser
res.clearCookie():清除cookie内容
res.set():设置响应head信息,如content-type,content-lenght等
res.end():结束请求响应循环
res.json():给客户端发送json数据
res.jsonp():给客户端发送jsonp数据,默认是名称callback
res.send():发送数据给客户端,可以是字符串,json对象或buffer
res.redirect():重定向页面,重定向请求
res.render():渲染指定模板给客户端
res.sendFile():将文件作为八位字节流发送
res.status():设置响应header状态码
res.sendStatus():同样是设置响应header状态码,它等同于send + status两个方法的链式操作