Node.js学习笔记

Node.js:基于 Chrome V8 引擎(解析效率最高)的JavaScript运行环境

模块化:遵守固定的规则,把一个大文件拆成独立并互相依赖的小模块

Node.js中的模块分类

  • 第三方模块

  • 用户自定义模块

  • 内置模块

    • fs文件系统模块

      • 导入fs模块:const fs = require(‘fs’)

      • 读取文件内容:fs.readFile(路径,编码格式,回调函数)

      • 写入文件内容:fs.writeFile(文件路径,写入的内容,编码格式,回调函数)

    • http创建 web 服务器模块

      • 导入http模块:const http = require(‘http’)

      • 创建web服务器实例:const server = http.createServer()

      • 为服务器实例绑定request事件:server.on(‘request’,function(req,res){})

      • 启动服务器:server.listen(8080,function(){})

    • path处理路径模块

      • path.join() 用来将多个路径片段拼接成一个完整的路径字符串

      • path.basename(路径,文件扩展名(可选参数)) 用来从路径字符串中,将文件名解析出来

向外共享模块作用域中的成员

  • 在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,外界用require()导入自定义模块就可以

  • exports 与 module.exports是一样的功效,但最终共享的结果还是以module.exports指向的对象为准

  • 注意:为了防止混乱,建议大家不要在同一个模块中同时使用exports和module.exports

包:Node.js的第三方模块

  • npm

    • node_modules文件夹用来存放所有已安装到项目中的包。require()导入第三方包时,就是从这个目录中查找并加载包。

    • package-lockjson配置文件用来记录node_modules 目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等。

    • npm init -y 快速创建package.json这个包管理配置文件

    • npm install (npm i)会一次性安装package.json中dependencies中的包

    • npm uninstall 包名 用来卸载指定的包

  • 包的分类

    • 1.项目包:那些被安装到项目的node_modules目录中的包,都是项目包

    • 2.全局包:在执行npm install命令时,如果提供了-g参数,则会把包安装为全局包。

    • 3.i5ting_toc:可以把md文档转为页面的小工具

  • Express:官方给出的概念,Express是基于Node.js平台,快速、开放、极简的Web开发框架。通俗讲,Express专门用来创建Web服务器

    • express.static( )函数,非常方便的创建一个静态资源服务器。比如,可以把public目录下的图片,CSS,JS文件对外开发访问

    • express.Router( ) 路由是客户端的请求与服务器处理函数之间的映射关系,比如你访问哪个地址,就调用哪个路由的方法和属性

    • Express中间件:本质上就是一个function处理函数

      • app.get(’/’ , function(req,res,next){ } )

        • next函数是实现多个中间件连续调用的关键,它表示把流转关系转交给下一个中间件或路由。
      • 中间件的作用:多个中间件之间,共享一份 req 和res

      • 中间件的分类

        • 1.应用级别的中间件

          • app.use(),app.get() 绑定到app实例上的中间件
        • 2.路由级别的中间件

          • 绑定到express.Router()实例上的中间件
        • 3.错误级别的中间件

          • function(err,req,res,next) { }
        • 4.Express 内置的中间件

          • express.static 快速静态托管资源的内置中间件

          • express.json 解析JSON格式的请求体数据

          • express.urlencoded 解析 URL-encoded 格式的请求体数据

        • 5.第三方的中间件

          • CORS中间件,可以方便的解决跨域问题,由一系列HTTP响应头组成,这些HTTP响应头就可以解除浏览器端的跨域访问限制

            • CORS 响应头部 Access-Control-Allow-Origin 来允许网页或网址来访问服务器

            • 如果客户端向服务器发送了额外的请求头信息,则需要在服务器端,通过Access-Control-Allow-Headers 对额外的请求头进行声明,否则这次请求会失败!

            • 默认情况下,CORS仅支持客户端发起GET,POST,HEAD请求。如果客户端希望通过 PUT、DELETE等方式请求服务器的资源,则需要在服务器端,通过Access-Control-Alow-Methods来指明实际请求所允许使用的HTTP方法。

            • 简单请求(客户端与服务器之间只会发送一次请求)

              • 1、请求方式:GET、POST、HEAD三者之一

              • 2、HTTP头部信息不超过以下几种字段:无自定义头部字段、Accept、Accept-Language、Content-Language、DPR.Downlink、Save-Data、Viewport-Width、Width .Content-Type (只有三个值application/x-www-form-urlencoded、multipart/form-data、text/plain)

            • 预检请求(客户端与服务器之间发送两次请求),OPTION预检请求成功之后,才会发起真正的请求

              • 1、请求方式为GET、POST、HEAD之外的请求Method类型

              • 2、请求头中包含自定义头部字段

              • 3、向服务器发送了application/json格式的数据

req.query对象,可以访问到客户端通过查询字符串的形式,发送给服务器的参数

req.params对象,是动态匹配到的URL参数

数据库

  • 传统型数据库(关系型数据库/SQL数据库) MySQL,Oracle,SQL Server

    • ​ 在传统数据库中,数据的组织结构分为数据库,数据表,数据行,字段这4大部分组成
  • 新型数据库(非关系型数据库/NoSQL数据库) Mongodb

SQL

SQL是结构化查询语言,专门用来访问和处理数据库的编程语言,能够让我们以编程的形式,操作数据库里面的数据

三个关键点

1、sql是一门数据库编程语言

2、使用sql语言编写出来的代码叫做sql语句

3、sql语言只能在关系型数据库中使用(例如MySQL,Oracle,SQL Server),非关系型数据库不支持SQL语言

SQL 语句的注释 “ --”

<> 等同于 !=(不等于)

操作数据库

在这里插入图片描述

在终端中输入 nodemon 文件名 来运行此代码

Web开发模式:

1、基于服务端渲染的传统Web开发模式

服务端渲染的概念:服务器发送给客户端的HTML页面,是在服务器通过字符串的拼接,动态生成的。因此,客户端不需要使用Ajax这样的技术额外请求页面的数据。

优点

​ (1)前端耗时少。因为服务器端负责动态生成HTML内容,浏览器只需要直接渲染页面即可。尤其是移动端,更省电。

​ (2)有利于SEO。因为服务器端响应的是完整的HTML页面内容,所以爬虫更容易爬取获得信息,更有利于SEO.

缺点

​ (1)占用服务器端资源。即服务器端完成HTML页面内容的拼接,如果请求较多,会对服务器造成一定的访问压力。

​ (2)不利于前后端分离,开发效率低。使用服务器端渲染,则无法进行分工合作,尤其对于前端复杂度高的项目,不利于项目高效开发。

2、基于前后端分离的新型Web开发模式

前后端分离的概念:前后端分离的开发模式,依赖于Ajax技术的广泛应用。简而言之,前后端分离的Web 开发模式,就是后端只负责提供API接口,前端使用Ajax调用接口的开发模式。

优点

​ (1)开发体验好。前端专注于UI页面的开发,后端专注于api的开发,且前端有更多的选择性。

​ (2)用户体验好。Ajax技术的广泛应用,极大的提高了用户的体验,可以轻松实现页面的局部刷新。

​ (3)减轻了服务器端的渲染压力。因为页面最终是在每个用户的浏览器中生成的。

缺点

​ (1)不利于 SEO。因为完整的HTML页面需要在客户端动态拼接完成,所以爬虫对无法爬取页面的有效信息。(解决方案:利用Vue、React等前端框架的SSR(server side render)技术能够很好的解决SEO问题! )

身份认证

身份认证(Authentication)又称“身份验证”、“鉴权”,是指通过一定的手段,完成对用户身份的确认。

日常生活中的身份认证随处可见,例如:高铁的验票乘车,手机的密码或指纹解锁,支付宝或微信的支付密码等。在Web开发中,也涉及到用户身份的认证,例如:各大网站的手机验证码登录、邮箱密码登录、二维码登录等。

不同开发模式下的身份认证

对于服务端渲染和前后端分离这两种开发模式来说,分别有着不同的身份认证方案:

1、服务端渲染推荐使用Session认证机制

Http协议的无状态性:指客户端的每次HTTP请求都是独立的,连续多个请求之间没有直接的关系,服务器不主动保留每次HTTP请求的状态。

如何突破 HTTP 无状态的限制? 采用Cookie ,现实生活中的会员卡身份认证方式

Cookie 是存储在用户浏览器中的一段不超过4KB的字符串。它由一个名称(Name)、一个值(Value)和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。

不同域名下的Cookie各自独立,每当客户端发起请求时,会自动把当前域名下所有未过期的Cookie一同发送到服务器。Cookie的几大特性:自动发送,域名独立,过期时限,4kb限制

Cookie在身份认证中的作用

客户端第一次请求服务器的时候,服务器通过响应头的形式,向客户端发送一个身份认证的Cookie,客户端会自动将Cookie保存在浏览器中。随后,当客户端浏览器每次请求服务器的时候,浏览器会自动将身份认证相关的Cookie,通过请求头的形式发送给服务器,服务器即可验明客户端的身份。(超市会员卡)

在这里插入图片描述

Cookie不具有安全性:由于Cookie是存储在浏览器中的,而且浏览器也提供了读写Cookie的API,因此Cookie很容易被伪造,不具有安全性,因此不建议服务器将重要的隐私数据,通过Cookie的形式发送给浏览器。(伪造会员卡)

解决方法:在收银机上进行刷卡认证,只有收银机确认存在会员卡,才能被正常使用

这种”会员卡+刷卡认证“的设计理论,就是Session认证机制的精髓

Session的工作原理

在这里插入图片描述

req.session.destroy() // 清空服务器保存的session信息

注意:存在跨域问题,推荐使用JWT认证机制

2、前后端分离推荐使用JWT认证机制

JWT(JSON Web Token)是目前最流行的跨域认证解决方案

JWT的工作原理

在这里插入图片描述

JWT的三组成部分:Header,Payload,Signature

  • Payload部分才是真正的用户信息,它是用户信息经过加密之后生成的字符串

  • Header和Signature是安全性相关的部分,只是为了保证Token的安全性
    在这里插入图片描述

在Express中使用JWT

1、安装JWT相关的包

npm install jsonwebtoken express-jwt

2、导入JWT相关的包

// TODO1:安装并导入 JWT 相关的两个包,分别是 jsonwebtoken 和 express-jwt
// jsonwebtoken用于生成JWT字符串
// express-jwt用于将JWT字符串解析还原称JSON对象
const jwt = require('jsonwebtoken')
const expressJWT = require('express-jwt')

3、定义secret密钥

// TODO2:定义secert密钥,建议将密钥命名为secretKey,用来加密和解密
const secretKey = 'itheima No1 ^_^'

4、在登录成功后生成JWT字符串

app.get('/api/login', function(req, res) {
    // 将req.body 请求体中的数据,转存为 userinfo常量
    const userinfo = req.body
        //登录失败
    if (userinfo.username !== 'admin' || userinfo.password !== '000000') {
        return res.send({
            status: 400,
            message: '登录失败!'
        })
    }

    // 登录成功
    // TODO3:在登录成功之后,调用 jwt.sign() 方法生成 JWT字符串,并通过token属性发送给客户端
    // 参数1:用户的信息对象
    // 参数2:加密的密钥
    // 参数3:配置对象,可以配置当前token的有效期
    // 记住,不要把密码加入到token中
    const tokenStr = jwt.sign({ username: userinfo.username }, secretKey, { expiresIn: '30s' })
    res.send({
        status: 200,
        message: '登录成功!',
        token: tokenStr, //要发送给客户端的 token字符串
    })
})

5、将JWT字符串还原为JSON对象

// TODO4:注册将JWT 字符串解析还原成 JSON 对象的中间件
// 只要配置成功,将解析出来的字符串 自动挂载到 req.user身上
// .unless({ path: [/^\/api\//] })) 用来指定哪些接口不需要访问权限
app.use(expressJWT({ secret: secretKey }).unless({ path: [/^\/api\//] }))
判断用户输入的密码是否正确

核心实现思路:调用bcrypt.compareSync(用户提交的密码,数据库中的密码)方法比较密码是否一致
返回值是布尔值(true一致,false不一致)

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*neverGiveUp*

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值