首先我们来说一说什么是node,其实node就是一个基于Chrome V8引擎的JS运行环境.(中文官网:http://nodejs.org/zh-cn)
在node中执行JS时,它属于JS的后端运行环境,并且它无法调用DOM和BOM 在简单的介绍完node后,我们应该如何进行学习呢?
学习的路径:JS基础语法+ Node .js内置API(fs,path,http等)+第三方API(express,mysql等),学完这些基本上你就大致能明白什么是node啦~
下载网址 https://nodejs.org.en/(LTS长期稳定版,Current新特性版本(不一定稳定哦))
WIN+R➡cmd 开打终端 node-v查看你所下载node的版本
path.join( ) 用来将 多个路径片段进行拼接成一个完整的路径字符串 参数 paths 路径片段的序列 返回值:字符串类型 **注意点:**在使用node时,使用path.join()方法进行处理,不要使用+进行字符拼接
path.basename(path,[ext]) 获取路径中文件名 参数 : 第一个参数 path 必选参数 表示路径字符串 第二个参数 ext 可选参数表示文件的拓展名
path.extname( ) 获取路径中文件的拓展名 参数 : 第一个参数 path 必选参数 表示路径字符串 第二个参数 ext 可选参数表示文件的拓展名 用法和上面的path.basename()类似 第三部分:我们来继续学习什么http模块 来学习http模块,我们就要知道什么是客户端,什么是服务器 负责消耗资源的是客户端,而对外负责提供网络资源的就是服务器
第一步 需要导入http模块 const http = require(‘http’) 第二步 创建web服务器实例对象 const server = http.createServer() 第三步 为服务器绑定request(请求)事件,监听客户端发送过来的网络请求 server.on(‘request’,(req,res) = >{ console.log(‘恭喜你绑定成功’) }) 第四步 启动我们的服务器 调用服务器实例方法 .listen() server.listen(80,() = >{ console.log(‘服务器启动成功,http://127.0.0.1’) })
req 是请求的对象,包含了与客户端相关的属性和数据,比如:req.url 客户端请求的URL地址 req.method 客户端的 method请求类型
res 是响应对象 ,比如你要发送到客户端的字符串,并且结束这次请求的处理过程 需要使用 res.end(XXX你需要传递的内容)
在进行res.end方法进行传递内容是,会出现中文乱码的情况,这个时候需要我们手动的进行设置请求头,在res.end()之前进行设置 res.setHeader(‘Content-Type’,‘text/html’,‘charset=utf-8’)
模块化,故名思意,就是成系统的,一块一块的,进行开发,就算丢失了其中的一个模块,并不会影响你的其他功能的运行。 15. 模块化的分类:内置模块(fs,http,path等),自定义模块(自己创建的每一个JS文件都是一个模块),第三方模块(第三方的模块,需要下载引入,后面会说明如何下载等) 模块化的好处:复用性高,维护方便,实现按照需要进行加载 引入自己的自定义模块时,可以省略后缀名 模块之间的作用域:自定义的方法或者变量只可以在当前的模块内被访问,这就是模块的作用域 作用域的好处:防止全局变量的污染
node遵循了模块化的规范(CommonJS) 1.module变量代表当前的模块 2.module是一个对象,exports是对外的接口 3.加载某个模块就是加载module.exports 4.require()用于进行加载模块 module对象, 向外共享模块作用域中的成员 module.exports可以将模块内部的成员共享出去(自定义模块中,默认时一个空的对象)向外界共享成员需要注意的地方: 1.require( ) 进行接收的就是共享出去的模块成员内的对象,导入的结果永远是以module.exports所指向的对象 2.通过exports和module.exports所指向的是同一对象,但是要以module.exports的为准。
**基本了解什么是模块化后,我们下面来了解什么是包** 说白了**第三方的模块就是包** 通常情况下,我们下载第三方的包使用的代码是 **npm install 包名**, 但是第三方的包的下载地址在国外,下面就讲解一下如何进行提升下载的速度。 1.切换到淘宝镜像:npm config set registry https://registry.npm.taobao.org 2.验证是否下载成功:npm config get registry 3.下载成功后会在终端显示:https://registry.npm.taobao.org/ npm i nrm -g 下载nrm为全局可用工具 nrm ls 查看可用的镜像 nrm use XX 切换你想要的镜像 **如果电脑不允许运行脚本,则执行如下操作:** 以管理员身份运行终端(powershell)使用:**set-ExecutionPolicy RemoteSigned**命令将计算机上的执行策略更改为 **RemoteSigned**,输入**Y**确定 如果想要查看自己能够下载的包,都有哪些如何使用,这里是官网⬇: [https://www.npmjs.cn/](https://www.npmjs.cn/)小伙伴们,第一次使用npm下载包后,自己的项目中会出现的文件: node_modules文件夹和package-lock.json配置文件 node_modules:存放所有的已经安装到项目中的包。 package-lock.json:自动来记录你所下载的包的记录,地址和当前的版本号。 注意点:这两个东西不需要自己做任何的修改,npm会自动的维护它们
如何下载指定版本的包? 通过@进行下载 例如:npm i moment@2.22.2 第一位时大版本 第二位是功能版本 第三位是BUG修复版本(点分十进制) package.json文件的用处(npm init -y快速创建)package-lock.json的作用: package.json官网,里面有更多的介绍! 注意点:只可以在英文【中文,空格不可以】的目录下运行成功 运行npm install时 会自动记录到这里面
我们的第三方模块会随着项目的开发会越来越大,而方便多人协作时,node_moduled 添加到.gitignore中 ,进行剔除,然后别人如果想下载你之前使用的模块,在package.json中有所有的模块记录,这个时候只需要 npm intall 就可以把所有的依赖再下载回来。
devDependencies节点 项目开发阶段使用,上线后不使用则安装到这里[npm i 包名 -D] 开发和上线都使用dependencies节点,项目上线阶段使用
1-模块(包)的加载机制:首先从缓存中进行获取 2-优先级:内置(fs,path等)>自定义(自己定义的JS)>第三方包 3-如果第三方或自定义的模块名称和内置模块的名称一样,也是优先会找到内置的,然后运行内置模块。 4- 自定义模块的加载机制: 必须以 ./ 或 …/ 的路径修饰符。 5-如果你省略了自定义模块的扩展名,那么它会按照下面的规则进行加载:👇 ①确切的文件名>②自动补全.js > ③自动补全.json > ④自动补全.node > ⑤加载失败 这个加载机制是这样的从 /node_modules文件夹中进行加载寻找,如果当前没有,则会移动到上一层的父级目录,知道系统的根目录为止。 目录作为模块: 1- package.json寻找main属性,require()加载入口文件 2-如果没有package.json,或者入口文件不存在或无法进行解析,则会试图加载目录下的index.js文件 3-如果以上二种都失败,会在控制台报错,【模块的缺失】:Error:Cannot find module ‘缺少模块的名称’。
基于Node.js平台,一种快速,开发,简单的Web开发框架。
Express的本质 npm的第三方包, 提供了快速创建服务器的便捷方法。 快速方便的创建web网站服务器或者API接口的服务器 Express中文官网: http://www.expressjs.com.cn 如何创建
**导入** const express = require('express') **创建服务器** const app = express() app.listen(80.()=>{ console.log('服务器创建成功') })如何进行监听get请求
参数 1 客户端的URL的地址 参数2处理函数 req:请求对象(请求相关的属性和方法)res:响应对象(响应相关的属性和方法) app.get('请求地址',fuction(req,res){ /处理函数/ })如何监听post请求
参数 1 客户端的URL的地址 参数2处理函数 req:请求对象(请求相关的属性和方法)res:响应对象(响应相关的属性和方法) app.post('请求地址',fuction(req,res){ /处理函数/ })内容响应到服务器 res.send( )
app.get('请求地址',fuction(req,res){ /处理函数/ }) app,post('请求地址',fuction(req,res){ /客户端发送文本/ res.send('请求信息') })获取动态参数【参数的个数和顺序都不能改变】
这里的ID是动态参数 app.post('请求地址/:id',fuction(req,res){ /获取动态参数/ req.send(req.params) }) req.params 获取URL中 通过 :匹配到的动态参数托管静态资源目录 express.static( ) 通过方法,将CSS JS 图片,HTML托管起来,方便使用 express在指定的静态目录中查找文件,并且对外开发,所以存放静态文件的目录名不会出现在URL中 托管多个静态目录:连续的调用即可
挂载路径前缀 app.use(’/public’,express.static(’/index.html’))
路由就是对应关系 比如:👇 express中的路由 指的是客户端的请求和服务器处理函数之间的映射关系
1-请求的类型 2-请求的URL地址 3-处理函数 语法如下: app.METHOD(PATH HANDLER) get和post 其实就是两种路由方式
路由匹配过程 模块化路由:为了方便对路由的管理,将路由抽离为单独的模块 步骤: 1创建路由模块为.js文件 2 调用 express.Router( ) 函数创建路由对象 3 向路由对象上挂载路由 4 使用module.exports 向外共享路由 5 使用app.use()函数注册路由 app.use()的作用,注册全局中间件
注册和使用路由模块 引入:const userRouter = require(’./router.js’) 注册:app.use(userRouter)
增加路由的前缀:app.use(’/api’,userRouter) 相同的一些资源 便于管理
什么是中间件? 中间件:业务流程的中间处理环节
express中间件的调用流程 可以连续的使用多个中间件,从而对这一次的请求进行预处理 中间件的格式。 本质上是一个fuction函数,格式如下
app.get('/',fuction(req,res,next){ next() }) next() 函数的作用 实现多个中间件的连续调用的关键,表示流传关系转交给下一个中间件或者理由 注意:中间件必须包含next()参数。路由处理函数只包含req,res中间件的格式:来自于官网截图
next()函数的作用:👇 作用就是当前的任务在此完成后,并继续向下传递
全局生效的中间件 客户端发起的任何请求,到达服务器之后都会触发的中间件 app.use(中间件函数的名称) 就可以定义全局中间件 简单的全局中间件定义方式:
全局中间件的简化形式
app.use((req,res,next)=>{ console.log('最简单的中间件函数') next( ) })中间件的作用: 1.多个中间件共享同一份req和res 统一为上游的req,res 添加自定义的方法和属性,可以供下游的中间件使用 2.拦截请求 在中间件中不定义next( ),可以把请求给拦截。 定义多个中间件: 可以使用app.use( )连续多个全局中间件,客户端的请求到达服务器后,会按照中间件定义的先后顺序进行执行。 局部中间件: 不使用app.use()定义的中间件 叫做局部生效中间件 局部中间件也可以定义多个,执行顺序从前到后 中间件使用时的五个注意事项: 1路由之前注册中间件; 2 客户端发送的请求可以连续多个的中间件进行使用; 3执行完中间件的业务代码后,不要忘记调用 next()函数; 4 为了防止代码逻辑的混乱,next后面不要写额外的代码; 5连续调用的多个中间件,中间件之间共享req和res对象;
中间件分类: 应用 路由 错误 内置 第三方
1应用级别:绑定到app实例上的中间件 app.post app.get app.use 2路由级别: express.Router() 3错误中间件: 有四个参数(err,req,res,next) 捕获整个项目发生的异常错误,项目崩溃 app,use((err,req,res,next)=>{ console.log(‘发生的错误’+ err.message) res.send(‘ERROR’+err.message) })
第三方中间件: 错误中间件:要放到所有的路由最后面【除了错误中间件放到最后,其他所有的都要放到路由的前面】
常用的3个内置中间件 express.static 快速托管静态资源 express.json 解析JSON格式的请求数据 配置:app.use(express.json()) express.urlencoded 解析URL-encoded格式的数据 配置后使用: (extended:false) 表示 使用内置的querystring 解析 (extended:true) 表示 使用第三方的qs模块解析 app.use(parser.urlencoded({extended:false}))
express如何写接口?? 编写get接口: 获得客户端参数的方式:
接口的跨域问题: 1- CORS 主流解决方案 推荐使用【使用步骤】 2- JSONP 只支持get 存在缺陷
cors:主要配置在服务器端,客户端不需要进行操作,就可以开启CORS的接口
使用CORS解决跨域问题 使用步骤有三步: jsonp接口: 浏览器端通过script的是src属性 请求服务器的数据,同属服务器返回一个函数的调用 1-不属于AJAX请求 2-仅支持get请求 express 自己封装的res.jsonp({name:XX,age:XX})
传统型数据库的数据组织结构 实际开发中库、表、行、字段的关系 ① 在实际项目开发中,一般情况下,每个项目都对应独立的数据库。 ② 不同的数据,要存储到数据库的不同表中,例如:用户数据存储到 users 表中,图书数据存储到 books 表中。 ③ 每个表中具体存储哪些信息,由字段来决定,例如:我们可以为 users 表设计 id、username、password 这 3 个 字段。 ④ 表中的行,代表每一条具体的数据。
数据库和可视化工具,在此分享给大家: 百度网盘链接:https://pan.baidu.com/s/1kOhJr6kvbdTCV3HYcDrY9Q 提取码:o587
1-数据库的创建 2-SQL语句的基本学习
快速插入insert into:
SELECT 查询语句 DELETE删除语句 标记删除:
Update 修改语句 更新: 切记:更新操作和删除操作 切记加上指定条件,防止数据污染和丢失
where: 排序:升序和降序 代码示例: 统计数量和为列设置别名:
后端:只负责提供API接口 前端:负责调用接口 优点: 1-开发体验好 2-用户的体验好(Ajax的应用) 3-减轻了服务器端的渲染压力
缺点:不利于SEO 但是可以通过VUE react的SSR解决SEO的问题
身份验证: 鉴权,通过一定的手段,完成用户身份的确认(Authentication)
为什么需要身份认证: 确认当前所声称某种身份的用户,确实是所生成的用户
如何进行身份验证👇: 服务器端渲染:session认真机制 前后端分离:JWT认证机制
session认证: http协议的无状态性,客户端的每次HTTP请求都是独立的,连续的多次请求也米有直接的关系,系统不会主动的保留每次的HTTP的请求状态
cookie在身份认证中的作用:
cookie 不具有安全性: Session的认证机制: 提高身份验证的安全性
Session的工作原理:
cookie: 会被自动的携带,如果用户访问一个正常网站后,再访问危险网站,危险网站中嵌入对正常网站的请求,此时可以根据用户的cookie身份信息访问正常网站,这样就不需要用户是谁,就可以冒充他的身份完成非法的操作
cookie只可以适用在浏览器上,APP上不认是cookie,没有cookie概念
session 在某一台服务器上存储用户的身份集合,如果分布部署,多台机器之间就需要session的同步,这样浪费机器的存储空间,同时需要在机器进行session的同步
token: 开发者主动操作才可以携带的,不会在发起请求的时候自动的携带,所以没有身份数据信息,服务器就不会执行请求要做的逻辑
token 可以使用在浏览器上,APP上 范围更广
token是对用户身份数据进行加密,然后给客户端使用,即使客户端请求到不同的机器上,后台只需要对token进行解密,只要数据能够进行正常的解密出来(有时候会加上过期的时间,),就说明这是正常的客户,这样就节省了存储空间和数据同步,带来一定的计算消耗