nodejs 模块开发,nodejs中的模块以及作用
一、模块化
模块化作为一种现代设计方法,这个概念最早源于制造业。如今,这一理念已经被各行各业所衍生和应用,软件开发中也大量采用了模块化思想。
所谓模块化思想,就是将一个大程序按照其功能划分成若干小模块,每个小程序模块完成一个特定的功能,并将所有的模块按照一定的方式组装成一个整体,完成整个系统所需的功能的一种编程方法。【推荐:node.js视频教程】
(一)、为什么需要模块化
为什么您需要模块化:
随着程序复杂度的增加,编写的代码越多,文件中的代码就越长,很难维护。(将执行特定功能的代码分组到不同的文件中,以便每个文件包含相对较少的代码)
当JavaScript有复杂的依赖关系时,很容易有些变量的属性或方法被覆盖或重写,导致变量污染。这是因为js没有命名空间,不像其他语言,可以有效避免重名问题。
有希望JavaScript私有的变量。
解决问题的模块化思维:
可维护性:每个模块都是相互独立定义的。模块需要尽可能脱离外部,以便我们独立维护和改造。维护一个模块比修改整个世界的逻辑判断要好得多。
命名冲突:为了避免JavaScript中的全局污染,我们使用函数作用域以模块化的方式构建命名空间,避免命名冲突。
文件依赖:一个函数可能依赖于一个或多个其他文件。在使用它的时候,除了介绍它本身,我们还需要考虑依赖文件。通过模块化,我们只需要引入文件,不需要考虑文件依赖(模块化可以帮助我们解决文件依赖的问题)。
可重用性:虽然粘贴复制很简单,但是要考虑我们以后的维护和迭代。
(二)、什么是Nodejs模块
,将常用函数作为模块提取到单独的js文件中。默认情况下,外部无法访问模块中的方法或属性。如果要在外部访问这些属性和方法,必须通过exports和module.exports在模块中公开它们,并在需要使用它们的地方通过require()引入它们。
//示例//导出语法
//sum.js
exports.sum=function(a,b){
返回a b;
}
//main.js
var m=require(。/sum’);
var num=m.sum(10,20);
console . log(num);
//modules.exports语法示例
//sum.js
函数sum(a,b){
返回a b;
}
module.exports=sum
//main.js
var sum=require(。/sum’);
sum(10,20);//30CommonJS规定:
在每个模块中,模块变量代表当前模块
变量是一个对象,它的导出属性(即module.exports)是一个外部接口。
加载一个模块实际上就是加载模块。require()方法用于加载模块。
(三)、nodejs中的模块分类与加载方式
在Node.js中,根据模块来源的不同,模块分为3类,即:
内置模块(内置模块是Node.js官方提供的,比如fs、path、http等。)
自定义模块(每个。用户创建的js文件是自定义模块)
第三方模块(包)(第三方开发的模块不是官方内置模块,也不是自定义模块,需要下载后才能使用)
//1.不需要指定加载内置模块的路径。
var http=require( http );
//2.加载用户的自定义模块
var sum=require(。/sum . js’);
//3.加载第三方模块
const MD5=require( MD5 );
(四)、模块作用域
类似于函数作用域。自定义模块中定义的成员(如变量和方法)只能在当前模块中访问。这种模块级访问限制称为模块范围。模块作用域的好处:防止了全局变量污染的问题
二、npm与包
(一)、包的介绍
Node.js中的第三方模块也叫包。该软件包由第三方个人或团队开发,所有人都可以免费使用。Node.js的内置模块只提供了一些底层的API,导致基于内置模块的项目开发效率低下。
该包基于内置模块进行封装,提供了更先进、更便捷的API,大大提高了开发效率。国外有一家IT公司叫npm,Inc,这家公司有一个非常著名的网站:https://www.npmjs.com/,是全球最大的包共享平台。我们可以使用这个包管理工具npm来管理包。这个包管理工具随Node.js安装包一起安装在用户的计算机上,请检查其版本。Npm -v
(二)、npm的使用
npm init初始化,生成package.json文件,记录项目的信息,记录包的信息Npm安装包名npm i包名下载包,将npm i包名放入node_modules文件夹- save npm i包名-S(开发环境)npm i包名- save-dev npm i包名-D(生产环境)npm列表列出当前目录下安装的包@1安装指定版本npm i包名-g安装全局包npm
npconfig set registry=3359registry.npm.taobao.org安装nrm:
$ npm i nrm -g检查nrm中内置的几个npm源的地址:
$ nrm ls的结果如下:
NPM-https://registry.npmjs.org/
cnpm-http://r.cnpmjs.org/
*淘宝-https://registry.npm.taobao.org/
新泽西州https://registry.nodejitsu.com/
红色高棉-http://registry.mirror.cqupt.edu.cn/
https://skimdb.npmjs.com/registry/先生
Edunepm-http://registry.enpmjs.org/移交nrm:
$ nrm使用npm查看当前镜像源:
Npm配置获取注册
(三)、全局安装nrm nodemon
淘宝NPM图片是一个完整的npmjs.org图片。可以用它代替正式版(只读)。同步频率目前为10分钟,以保证尽可能与官方服务同步。
可以使用淘宝定制的cnpm (gzip压缩支持)命令行工具,而不是默认的npm:
m install-g cnpm-registry=https://registry.npm.taobao.org安装包
cn install[模块名称]
(四)、淘宝cnpm工具
三、路由
express
$ NPM快速安装-保存
一、下载与安装
路由的定义由以下结构组成:
App。方法(路径,处理程序)名称描述appapp是一个express实例。METHODMETHOD用于指定要匹配的HTTP请求方法。PATHPATH是服务器的路径。Handler是路由匹配时需要执行的处理程序(回调函数)。路由路径和请求方法一起定义了请求的端点,可以是字符串、字符串模式和正则表达式。
app.get(/),function (req,res) {
RES . send( root )})app . get(/about ,function (req,res) {
RES . send( about )})app . get(/random . text ,function (req,res) {
Res.send(random.text)})使用字符串模式的路由路径示例:
app.get(/ab? cd ,函数(请求,结果){
res.send(ab?cd) //abcd,acd})app.get(/ab/:id ,function (req,res) {
RES . send( ab/:id )})app . get(/ab CD ,function (req,res) {
Res.send(ab cd) //b可以重复一次或多次}) app.get (/ab * CD ,function (req,res) {
Res.send(ab*cd) //任意书写ab和cd之间的任意字符})app.get(/ab(cd)?e ,函数(请求,结果){
res.send(ab(cd)?E)})可以为请求处理提供多个回调函数,其行为类似于中间件。
app.get(/example/b ,function (req,res,next) {
console.log(响应将由下一个函数发送.)
next()},function (req,res) {
res.send(来自B的问候!)})var cb0=function (req,res,next) {
console.log(CB0 )
next()}var cb1=function (req,res,next) {
console.log(CB1 )
next()}var cb2=function (req,res) {
res.send(你好,来自C!)}app.get(/example/c ,[cb0,cb1,cb2])var cb0=function (req,res,next) {
console.log(CB0 )
next()}var cb1=function (req,res,next) {
console.log(CB1 )
next()}app.get(/example/d ,[cb0,cb1],function (req,res,next) {
console.log(响应将由下一个函数发送.)
next()},function (req,res) {
res.send(你好,来自D!)})
二、路由
三、中间件
//通用中间件var express=require( express )var app=express()app . use(function(req,res,next) {
console.log(Time:,Date.now())
Next()})//应用中间件app.use(/login ,function (req,res,next) {
Console.log (time:,date.now ()}):
1.应用级中间件
路由器级中间件的工作方式和应用级中间件一样,只是绑定了express。路由器()。
var路由器=express。router()var express=require( express )var app=express()var router=express。router()router . use(function(req,res,next) {
console.log(Time:,Date.now())
next()})router.get(/user/:id ,function (req,res,next) {
console.log(请求URL:,req.originalUrl)
next()},function (req,res,next) {
console.log(请求类型:,请求方法)
next()})
2.路由级中间件
app . use(function(err,req,res,next) {
控制台.错误(err.stack)
res.status(404)。发送(“有东西坏了!”)})
3.错误处理中间件
express.static提供静态资源,如HTML文件、图片等。
Express.json使用json有效负载解析传入的请求。注意:它可用于Express 4.16.0
//应用级中间件,获取后json参数app . use(express . JSON());Express.urlencoded使用URL编码的负载解析传入的请求。注意:它可用于Express 4.16.0
//应用级中间件,获取后表单参数app . use(express . urlencoded({ extended:false });
4.内置中间件
5.第三方中间件
req.query是一个可以获取客户端get请求的查询字符串的对象。默认值是{}。req.body包含在请求正文中提交的数据键值对。默认未定义,使用解析中间件express.json()时,express . urlencoded()
四、获取请求参数
五、静态资源托管
express . static内置中间件函数语法:
express.static (root,[options]) root参数指定提供静态资源的根目录。
语法:
例如,公共目录中的图片、CSS文件和JavaScript文件可以通过以下代码供公众访问:
App.use(express.static(public ))现在,您可以访问公共目录中的所有文件:
http://本地主机:3000/images/kitten.jpg
http://localhost:3000/CSS/style . CSS
http://本地主机:3000/js/app.js
http://本地主机:3000/images/bg.png
3358 localhost:3000/hello . html
静态资源示例:
如果要使用多个静态资源目录,请多次调用express.static中间件函数:
app.use(express.static(public ))
当app . use(express.static( uploads ))访问一个静态资源文件时,express . static的中间件函数会按照添加目录的顺序找到需要的文件。
多个静态资源目录:
express.static中间件功能可以为一些静态资源服务创建一个虚拟路径前缀(这个路径实际上并不存在于文件系统中)。请指定静态目录的挂载路径,如下所示:
App.use (/static ,express.static (public ))现在可以通过前缀为/static的地址访问public目录中的文件。
http://本地主机:3000/static/images/kitten.jpg
http://localhost:3000/static/CSS/style . CSS
http://本地主机:3000/static/js/app.js
http://本地主机:3000/static/images/bg.png
3358 localhost:3000/static/hello . html
虚拟路径:(非得添加static,没有意义)
六、模板引擎
做好静态页面。动态特效提供前端代码给后端,后端要删除静态html和里面的虚假数据,通过模板动态生成html内容【外链图片传递失败,源站可能有防盗链机制,建议保存图片直接上传(IMG-JL 70 ca 3p-1658387147221)(C:\ users \ 1933 \ desktop \前端全栈\课件\前后交互\imgs\ server
一、.服务端渲染 SSR
做好静态页面,json模拟动态效果,ajax动态创建页面真实界面数据,前后联调【外链图片传递失败,源站可能有防盗链机制,建议保存图片直接上传(IMG-pxrcidw 2-1658387147223)(C:\ users \ 11933 \ desktop \)
二、前后端分离,BSR
三、模板引擎
与Express一起使用的一些流行的模板引擎是Pug、Mustache和EJS。默认情况下,Express application generator使用Pug,但是它也支持其他几种。
需要在应用程序中进行以下设置,以允许Express呈现模板引擎:
视图,放置模板文件的目录。示例:app.set(views ,)。/views’)。视图引擎,要使用的模板引擎。例如,要使用PUG模板引擎:app.set(视图引擎, Pug )。
Express模板引擎
路由呈现的模板并将呈现的HTML字符串发送到客户端。
Res.render (view [,locales] [,callback]) view:一个字符串,view是要渲染的模板文件的文件路径。Locales:其属性定义视图的局部变量的对象。app.get(/),function (req,res) {
res.render(index ,{ title:嘿,消息:你好!})
}):
在路由中渲染模板
:
四、ejs模板引擎的使用
NPM安装ejs:
安装ejs
:
在express配置ejs模板引擎
在app.js中添加以下代码,配置Express使用ejs模板引擎。
app.set(views ,path.join(__dirname, views ));//设置模板存放位置app.set(视图引擎, ejs );
使用ejs模板引擎
在app.js中添加以下代码,以配置Express使用ejs模板引擎。并将模板后缀指定为html。
app.set(views ,path.join(__dirname, views ));//设置模板存放位置app.set(视图引擎, html );app.engine(html ,require(ejs )。render file);//使用ejs模板引擎解析html
设置模板后缀为html
%=% output标签
%-%输出html标签(浏览器将解析html)
% #%注释标签
%%过程控制标签(写if,else,for)
%-include (user/show ,{user: user})%导入常用模板内容
ejs模板语法
:
MVC框架:
:
JSON:
对象结构:对象结构在JSON中表示为{}括起来的内容。数据为{key: value,key: value,…}的键-值对结构。其中,key必须是用英文双引号包裹的字符串,value的数据类型可以是数字、字符串、布尔、null、数组、对象六种类型。
{
名称: zs ,
年龄:20,
性别:男性,
Hobby: [Eat , Sleep]}数组结构:数组结构在JSON中表示为[]括起来的内容。数据结构为["Java "," JavaScript ",30,true …]。数组中的数据类型可以是数字、字符串、布尔、空、数组和对象。
[ 100,200,300 ][ true,false,null ][ { name: zs , age: 20},{ name: ls , age :30 }][ AAA , bbb , ccc ],[ 1,2,3 ] ] :
一、概念:
属性名必须用双引号括起来。字符串类型的值必须用双引号括起来。JSON中不允许使用单引号。注释不能用JSON编写。JSON的最外层必须是对象或数组格式。未定义的or函数不能用作JSON的值。JSON的作用:在计算机和网络之间存储和传输数据。JSON的本质:用字符串表示Javascript对象数据或数组数据
二、JSON的两种结构
JSON是JS对象的字符串表示。它使用文本来表示JS对象的信息,JS对象本质上是一个字符串。
//这是一个对象var obj={a: Hello ,b: World}//这是一个json字符串,其本质是一个字符串varjson= {a: hello , b: world}:
三、JSON语法的注意事项
实现JSON字符串到JS对象的转换,使用JSON.parse()方法将JS对象转换成JSON字符串,使用JSON.stringify()方法
四、JSON和JS对象的关系
:010
五、JSON和JS对象的互转
建议保存图片直接上传(IMG-g 502 i2rt-1658387147224)(C:\ users \ 1933 \ desktop \前端全栈\课件\前后交互\imgs\请求消息组件. png)]
请求行:由请求方法(get、post)、URL (/login?)和HTTP协议版本,用空格分隔。请求头:用于描述客户端的基本信息,以便通知服务器关于客户端的信息。请求的头部由多行键/值对组成,每行的键和值由英文冒号分隔。【外链图像传输失败,源站可能有防盗链机制。建议保存图片直接上传(IMG-IMFA 8U4Y-1658387147225)(C:\ users \ 1933 \ desktop \前端全栈\课件\前后交互\imgs\ request header field.png)]
空行:最后一个请求头字段后面是一个空行,通知服务器请求头到此结束。请求中的空行,用于分隔请求头和请求体。请求体:存储在请求体中的数据是通过POST提交给服务器的数据。只有POST请求有请求体,但是GET请求没有请求体!
HTTP
一、概念
【外链图像传输失败,源站可能有防盗链机制。建议保存图片直接上传(img-n 0 rfsha 8-1658387147225)(C:\ users \ 11933 \ desktop \前端全栈\课件\前后台)
行:由HTTP协议版本、状态码、状态码描述文本三部分组成,用空格隔开;响应头:用于描述服务器的基本信息。响应头由多行键/值对组成,每行的键和值由英文冒号分隔。空行:在最后一个响应头字段结束后,将跟随一个空行来通知客户端响应头已经结束。响应中的空行,用于分隔响应标头和响应正文。响应体:存储在中的是服务器响应客户端的资源内容。
二、请求(请求报文)
[外部链接图像传输失败,源站可能有防盗链机制。建议保存图片直接上传(IMG-VwQMQRAP-1658387147226)(C:\ users \ 1933 \ desktop \前端全栈\课件\前后交互\imgs\http requested。
请求消息的组成
[外链图像传输失败,源站可能有防盗链机制。建议保存图片直接上传(IMG-28 yrkp 8M-1658387147227)(C:\ users \ 1933 \ desktop \前端全栈\课件\前后交互\ IMGS \
三、响应(响应报文)
响应消息的组成:
四、HTTP请求方法
XML是指可扩展标记语言。HTML超文本标记语言XML旨在传输和存储数据。XML和HTML类似,只是HTML是预定义的标签,而XML没有预定义的标签,都是自定义标签来表示一些数据。{“书名”:“三体”,“作者”:“zs”,“价格”:30}“书
标题三体/标题
作者刘/作者
价格30.00/price/book
五、响应的状态码
Ajax:
无需刷新页面即可与服务器通信,允许根据用户事件更新部分页面内容
一、概念
没有浏览历史无法回滚。有一个交叉问题。同源策略:协议、域名、端口号SEO不友好
二、XML
get方法,请求参数//1.//2.初始化,设置请求方法和URL xhr.open (get , http://127.0.0.1: 3000/server?username=zs password=1234’);//3.发送xhr . send();//4.绑定事件并处理服务器返回的结果。readstatexhr的属性状态为0,1,2,3,4x HR . onreadystatechange=function(){
//服务器返回的结果
if(xhr.readyState==4){
//确定响应的状态代码
if(xhr.status==200){
//行、头和正文
console . log(xhr . status);
console . log(xhr . status text);
console . log(xhr . response);
console . log(xhr . getallresponseheaders());
}
}}
三、特点
优点:
使用步骤:
运行以下命令安装crypto js:NPM I crypto-js in/log in . js,import crypto-js:const crypto=require( crypto-js )for plain text encryption with ASE://encrypt var a=crypto . AES . encrypt( ABC , key ). tostring .///secret key//decrypt var b=crypto . AES . decrypt(a, key )。tostring(crypto . enc . utf8);//根据UTF8代码解析原字符串
缺点:
步骤:
安装joi包为表单中携带的每个数据项定义校验规则:NPM Install joi Install @ escook/express-joi中间件实现自动校验表单数据的功能:NPM I @ escook/express-joi new/schema/log in . js用户信息校验规则模块:constjoi=require (joi)/*。
* string()值必须是字符串。
* alphanum()值只能是包含a-zA-Z0-9的字符串。
* min(长度)最小长度
*最大(长度)最大长度
* required()值是必需的,不能未定义。
*模式(正则表达式)值必须符合正则表达式的规则。
*///用户名constusername=joi.string()的认证规则。必选();//密码验证规则const password=joi.string()。模式(/[\ s] {6,12} $/)。必选();//登录表单的认证规则对象exports.login_schema={
//表示req.body中的数据需要验证。
正文:{
用户名,
密码,
},}修改/router/admin/login.js: //1中的代码。中间件const express joi=require( @ escook/express-joi )//2。导入所需的验证规则对象const {login _ schema}=require(././) //3登录函数router.post (/,expressjoi (login _ schema),(req,RES)={ }];在index.js的全局错误级中间件中,捕捉验证失败的错误,并将验证失败的结果返回给客户端:const joi=require( joi )//error middleware app . use(function(err,req,res,next) {
//数据验证失败。
if(err joi的实例。ValidationError)返回RES . send(err);
//未知错误
Res.send(err)})
四、发送请求
HTTP协议是以ASCII码传输,基于TCP/IP协议的应用层规范。标准的HTTP请求分为三个部分:状态行、请求头和消息体。协议中规定POST提交的数据必须放在消息的实体体中,但是协议没有规定数据必须使用什么编码方法Content-Type。
根据服务器的请求头中的Content-Type字段,我们可以知道请求中的消息体是如何编码的,然后解析消息体。所以当谈到POST的数据提交方案时,它包括两个部分:消息体的内容类型和编码方法。Content-Type的四个值分别代表四种方式,如下所示:
方式一:application/x-www-form-urlencoded浏览器的原生表单form,如果没有设置enctype属性,那么最终会以application/x-www-form-urlencoded的形式提交数据。内容类型被指定为application/x-www-form-urlencoded。提交的数据采用key=valkey=val的方式编码,key和val都是URL转码。例如,在服务器端PHP中,可以使用$_POST[key]来获取值。
方式二:multipart/form-data常见的帖子数据提交方式。该方法支持文件上传,但是表单的enctyped必须设置为等于该值。使用multipart/form-data方法将生成一个边界来划分不同的字段。为了避免与文本重复,边界是一个长的随机拼接的字符串。则Content-Type指示数据由多部分/形式数据编码,并包含在该请求的边界值中。消息体以- boundary-结尾。
方式三:application/json由于JSON规范的流行,现在越来越多的开发者使用application/json的Content-Type作为响应头。用来告诉服务器消息体是一个序列化的JSON字符串。除了较低版本的IE,各大浏览器都原生支持json.stringify,服务器端语言也有处理json的函数。JSON可以格式化和支持比键值对复杂得多的结构化数据。普通键值对中的值只能是字符串,而使用JSON,键值对可以重复嵌套。
方式四:text/xml它是一种远程调用规范,使用HTTP作为传输协议,使用XML作为编码方法。但后来很少用了。可能十几年前,json出来之前,数据是交互对接的。
总之,application/x-www-form-urlencoded和multipart/form-data都是浏览器支持的,并且应用广泛。application/json是一个流行的新趋势。
项目:
Install multer pm I Multer Import Multer const Multer=require( Multer )配置存储Multer接收到的文件的文件夹、存储图片的名称//上传文件的存储路径以及文件名const storage=Multer . disk storage({
目标:path.join (_ _ dirname,./static/uploads ),//确定上传文件的物理位置
Filename: function (req,file,CB){//自定义设置文件的名称,根据上传时间的时间戳命名。
let type=file . original name . split( . )[1]
cb(null,` ${file.fieldname}-${Date.now()。toString(16)}。${type} `)
}})将此配置应用于multer实例const upload=multer({ storage });在需要接收文件的路由中应用upload.single(“文件”)中间件(1)。该文件是前端提交表单时表单的字段名。(2).upload是multer中顶层构造函数生成的实例。一般思维:什么是multer?Multer是Express官方推出的中间件,用于处理node.js前端以multipart/form-data请求的数据。注意:Multer不会处理任何非多部分/表单数据表单数据。
原理:Multer实例的Single (# # )是一个方法。当这个方法作为中间件放在某个路由上。主体对象和一个或多个文件对象将被添加到express的请求对象中。body对象包含表单的文本字段信息,file或files对象包含由对象表单上传的文件信息。下图是req.file的样子。当前客户端请求后台接口。在匹配当前路由时,首先通过这个multer中间件,它会从前端解析文件,在上面步骤3的配置文件解析后将文件保存在文件夹中,在上面步骤3的配置文件解析后将名称重命名为文件名。同时,一个文件对象将在请求时被挂载。这个文件对象是当前上传文件的信息。我们可以通过req.file.filename获取重命名后的文件名,然后将文件名保存到数据库中。如果前端要访问之前上传的图片,后台只需要获取数据库中的文件名,然后映射到我们请求的路径,在public的静态资源下请求存储这些文件的文件夹。
Multer是一个中间件。我建议把这个中间件写成一个单独的文件。最后,公开已配置的multer实例,并将其作为中间件应用于需要它的路由中。可以快速处理前端发来的文件。而不是每个文件都写一次。也更符合我们模块化编程的思路。下图显示了我的multer文件的配置。
一、对密码进行加密处理
[外部链接图像传输失败,源站可能有防盗链机制。建议保存图片直接上传(IMG-9d 1 vzmyl-1658387147228)(C:\ users \ 1933 \ desktop \前端全栈\课件\前后交互\imgs\ rich
二、表单校验规则
使用:
textarea id= demo style= display:none;/textarealayui.use([layedit],function(){
Layedit.build(demo)})基于Layedit的方法:
方法描述var index=layedit.build (id,options)用于构建编辑器索引的核心方法:即该方法返回的索引参数id:实例元素(一般为textarea)的id值参数options:编辑器的可配置项,下面将进一步描述,layedit.set(options)设置编辑器的全局属性,即上述构建方法的options layedit . get content(index),并获取编辑器的内容参数index:即, 执行layedit.build返回的值layedit.getText(index)参数编辑器获取的纯文本内容索引:同上layedit.sync(index)用于将编辑器内容同步到textarea(一般用于异步提交)参数索引:同上layedit.getSelection(index)获取编辑器选择的文本参数索引:同上编辑器属性设置:
属性描述toolArray重新定义了编辑器工具栏,例如:tool: [link , unlink , face] Hidetoolarray不显示编辑器工具栏,一般用于隐藏默认配置工具barheightNumber设置编辑器的初始高度uploadImageObject设置图片上传接口,例如:上传图片:{URL:/upload/,type: post}富文本编辑器工具栏:
let richtextInex=layedit . build( rich text ,{
工具:[
Strong //Bold
,斜体//斜体
,下划线//下划线
,删除//删除线
, //分割线
,左//左对齐
,居中//居中对齐
,右//右对齐
,图像//插入图片
],
upload image:{ URL:/uploadrichtext ,键入: POST}
})
三、四种常见的POST提交数据方式
(一),会话简介
会话是记录客户状态的另一种机制。区别在于Cookie存储在客户端浏览器中,而会话存储在服务器上。会议的目的:
会话在服务器端运行。当客户端第一次访问服务器时,可以保存客户端的登录信息。
当客户访问其他页面时,可以判断其登录状态并给出提示,相当于登录拦截。
Session可以结合Redis或者数据库进行持久化操作,并且在服务器挂机的时候不会造成一些客户信息(购物车)。
失落。
(2)会议的工作流程
当浏览器访问服务器并发送第一个请求时,服务器端将创建一个会话对象,生成一个类似于
Key,value,然后将key(cookie)返回给浏览器(客户端)。浏览器下次访问时将携带密钥(cookie ),
查找相应的会话(值)。客户信息保存在进程中。
(三)、Cookie和Session的区别:
Cookie存储在客户端的浏览器中,会话数据放在服务器上。
Cookies不太安全。还有人可以分析本地存储的cookie,欺骗cookie。出于安全原因,应该使用会话。
会话将在服务器上保存一段时间。当访问数量增加时,它将占用您的服务器的性能。为了降低服务器的性能,应该使用COOKIE。
单个cookie保存的数据不能超过4K,许多浏览器限制一个站点最多保存20个cookie。
(4)快速会话的使用
设置-会话:
Npm快速安装-会话介绍快速安装-会话:
var session=require(" express-session ");设置公文提供的中间件:
app.use(会话({
秘密:“键盘猫”,
是的,
save initialized:true
}))使用:
设置值req.session.username=张三;
获取值req . session . username express-session的公共参数:
1.name——cookie的名称(原始属性名是key)。(默认为: connect.sid)2。存储会话存储实例3。secret-使用它来签署会话cookies以防止篡改4。cookie会话cookie设置(默认值:{path:/,http only: true,Secure: false,maxage: null}) 5 .genid-生成新会话id的函数(默认使用uid2库)6。rolling-对每个请求强制设置一个cookie,这将重置cookie的过期时间(默认值:false)7。重新保存-强制保存会话,即使它没有改变(默认:真)8。代理-设置安全cookies时信任反向代理(通过“x-x-forwarded-proto”头)。当设置为真时,
将使用“x-x-forwarded-proto”报头。当设置为false时,将忽略所有标题。如果未设置此属性,将使用Express的信任代理。9.save initialized-强制存储未初始化的会话。当创建新会话且未设置任何属性或值时,它在
未初始化状态。在设置cookie之前,有助于登录验证,减轻服务器的存储压力,权限控制。(默认值:true)10。unset-控制是否取消req.session(例如,通过删除或将其值设置为null)。这可以使会话保持express-session的常用方法:1。Session.destroy():删除会话,并在检测到客户端关闭时调用它。2.Session.reload():当会话被修改时,刷新会话。3.Session.regenerate():初始化现有会话。4.Session.save():保存会话。用例://配置中间件app.use(会话({
secret:‘这是string key’,//可以随便写。String类型的字符串,用作服务器生成的会话的签名。
Name:session_id ,/*默认情况下,保存在本地cookie中的名称可以不设置*/
Resave: false,/*强制保存会话,即使它没有更改。默认值为true。建议设置为false。*/
save initialized:true,//strong制存储未初始化的会话。默认值为true。建议将其设置为true。
cookie: {
MaxAge:5000 /*到期时间*/
},/*安全https是访问cookie的唯一方式*/*/
//设置到期时间,例如30分钟。只要访问页面,30分钟不活动就会过期。
Rolling:true //对每个请求强制设置cookie,这将重置cookie的过期时间(默认值:false)}):
四、multer
form对象属性:属性描述action接收请求URLelements表单中的所有控件元素设置长度表单控件的数量enctype编码类型示例:enct
ype=“multipart/form-data”name表单元素名称Form 对象方法:方法描述reset()把表单的所有输入元素重置为它们的默认值。submit()提交表单。Form 对象事件:事件描述onreset在重置表单元素之前调用。onsubmit在提交表单之前调用。表单控件的属性:属性描述value获取和设置值disabled获取或设置表单控件是否禁用值为true或 falsetype读取表单控件的类型form所在表单元素对象readOnly控件只读属性 Boolean 不能更改只能复制和读取name获取与设置name字段名表单控件的事件:事件描述onblur当失去焦点的时候onfocus当获取焦点的时候onchange当内容改变并失去焦点的时候oninput在用户输入时触发表单控件的方法:方法描述focus()获得焦点blur()失去焦点select()选择文本控件中的所有文本内容以上就是总结Node.js模块开发及常用技巧分享的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。