node入门到放弃(持续更新)

    技术2022-07-11  98

    **node初认**

    首先我们来说一说什么是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的版本

    第一部分:咱们介绍一下系统模块

    fs模块(文件系统模块) fs.readFile( ) 用来读取指定文件中的内容 fs.readFile(path,[options],callback) 第一个参数是路径 第二个参数是编码格式通常为utf8 第三个参数是回调函数 fs.writeFile( ) 用来指定文件中写入的内容 注意点: 在使用fs模块时进来不要使用 ./ 或 …/ 的相对路径, 所以要使用可以提供完整的路径 __dirname

    第二部分:咱们说一下路径模块

    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’)

    第四部分:什么是node的模块开发

    模块化,故名思意,就是成系统的,一块一块的,进行开发,就算丢失了其中的一个模块,并不会影响你的其他功能的运行。 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 ‘缺少模块的名称’。

    第六部分:什么是Express框架

    基于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的问题

    第十三部分:身份认证(鉴权)session cookie

    身份验证: 鉴权,通过一定的手段,完成用户身份的确认(Authentication)

    为什么需要身份认证: 确认当前所声称某种身份的用户,确实是所生成的用户

    如何进行身份验证👇: 服务器端渲染:session认真机制 前后端分离:JWT认证机制

    session认证: http协议的无状态性,客户端的每次HTTP请求都是独立的,连续的多次请求也米有直接的关系,系统不会主动的保留每次的HTTP的请求状态

    cookie在身份认证中的作用:

    cookie 不具有安全性: Session的认证机制: 提高身份验证的安全性

    Session的工作原理:

    第十四部分【重点】:cookie session token:👇👇👇👇👇👇

    cookie: 会被自动的携带,如果用户访问一个正常网站后,再访问危险网站,危险网站中嵌入对正常网站的请求,此时可以根据用户的cookie身份信息访问正常网站,这样就不需要用户是谁,就可以冒充他的身份完成非法的操作

    cookie只可以适用在浏览器上,APP上不认是cookie,没有cookie概念

    session 在某一台服务器上存储用户的身份集合,如果分布部署,多台机器之间就需要session的同步,这样浪费机器的存储空间,同时需要在机器进行session的同步


    token: 开发者主动操作才可以携带的,不会在发起请求的时候自动的携带,所以没有身份数据信息,服务器就不会执行请求要做的逻辑

    token 可以使用在浏览器上,APP上 范围更广

    token是对用户身份数据进行加密,然后给客户端使用,即使客户端请求到不同的机器上,后台只需要对token进行解密,只要数据能够进行正常的解密出来(有时候会加上过期的时间,),就说明这是正常的客户,这样就节省了存储空间和数据同步,带来一定的计算消耗

    Processed: 0.015, SQL: 9