浏览器中有js解析引擎 chrome:v8 性能最好 safri:JSCore 。。。
每个游览器内置了DOM、BOM这样的API函数。浏览器中的js可以调用他们。
浏览器的引擎、内置API
可以,需要借助nodejs
Node.js是一个基于v8引擎的js
- 浏览器是js的前端运行环境
- nodejs是js的后端运行环境
- nodejs无法调用DOM和BOM等浏览器内部的API
js基础语法+node内置api模块(fs、path、http)+第三方api模块(express、mysql等)
- LTS:稳定版
- current:开发版本,存在bug
- 打开终端
- 输入
fs模块是node官方提供的、用来操作文件的模块。
通过err对象是否为null
读取文件 小红=99 小白=100 小黄=70 小黑=66 小绿=88 写入新文件内容 小红,99 小白,100 小黄,70 小黑,66 小绿,88
出现路径拼接问题,是因为提供了 https://article.juejin.cn/post/ 或者 https://article.juejin.cn/ 开头的相对路径 解决方法: 移植性差。不利于维护。 __dirname:当前文件所处目录
path模块是node官方提供的、用来处理路径的模块。它提供了一系列的方法和属性。
- path.join() 用来将多个路径片段拼接成一个完整的路径字符串
- path.basename() 从路径字符串中,将文件名解析出来
- path.extname() 获取文件的扩展名
注意: https://article.juejin.cn/ 会抵消前面的一层路径
用来创建web服务器的模块 http.createServer()
域名服务器(DNS)将域名转化为IP地址。
- 导入http模块
- const http = require('http')
- 创建web服务器实例
- const server = http.createServer()
- 为服务器实例绑定request事件,监听客户端请求
:
- req
- req是请求对象,它包含了与客户端相关的数据和属性
- req.url 是客户端请求的url地址
- req.method是客户端的method请求类型
- res
- res是响应对象
- res.end(),向客户端发送指定内容
- res.setHeader('Content-Type',"text/html; charset=utf-8") 防止响应内容
- 启动服务器
案例:
- 提高了代码的复用性
- 提高了代码的可维护性
- 实现了按需加载
例如:
- 使用什么样的语法格式来引用模块
- 在模块中使用什么样的语法格式向外暴露成员
- 内置模块
- 由nodejs官方提供的,例如fs、path、http
- 自定义模块
- 用户自己创建的js文件,都是自定义模块
- 第三方模块
- 由第三方开发出来的模块,使用前需要先下载
使用方法
使用require() 方法加载其他模块时,会执行被加载模块中的代码
在自定义模块中定义的变量、方法等成员,,无法被外界访问。
在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用。 案例: 定义自定义模块
加载自定义模块
永远以module.exports指向的对象为准 例如: 定义自定义模块
加载自定义模块
默认情况下,exports和module.exports指向
注意: 这里只是把exports的指针指向了module.exports,如果更改了exports的指向,那么二者就不再是一个对象,此时require模块得到的是module.exports所指向的对象 例如:
包是基于内置模块封装出来的,提供了更高级、更方便的API,极大的提高了开发效率
Node Package Manager(),这个包管理工具随着Node.js的安装包一起安装用户的电脑上。
通过
例如:2.24.0
- 第一位数字:大版本
- 第二位数字:功能版本
- 第三位数字:bug修复版本
在项目根目录中,必须提供一个叫做的包管理配置文件。 作用:用来记录项目中安装了哪些包,从而方便剔除node_modules目录之后,在团队成员之间共享项目的源代码。
运行npm install命令,会自动把包的名称和版本号,记录到package.json文件中。
专门记录安装了哪些包,开发和项目上线之后都会用到
如果某些包,在项目上线后不会用到,那么这些包就记录到devDependencies中。
npm install
npm uninstall
卸载的包,会自动从package.json中的dependencies中移除掉。
默认从国外的registry.npmjs.org/服务器进行下载,会很慢 解决方式:
为了更方便的切换下包镜像源,可以安装nrm这个工具
npm install 如果提供了参数,则会把包安装为全局包。 注意:
判断某个包是否需要全局安装后才能使用,可以参考官方提供的使用说明
- 必须以单独的目录而存在
- 包的顶级目录下必须包含package.json这个包管理配置文件
- package.json中必须包含name、version、main这三个属性,分别代表包的名字、版本号、包的入口
初始化包的基本结构
- 新建 my 文件夹,作为包的根目录
- 在 my 文件夹中,新建如下三个文件:
- package.json
- index.js
- README.md
编写完,使用module.exports把对应的方法共享出去。
README.md,包的使用说明文档。
- 注册npm账号
- www.npmjs.com/
- 登录npm账号
- 在终端里面输入
- 输入 账号密码邮箱后,即可登录成功。
- 注意:执行命令之前,必须先把包源切换为npm官方服务器
- 发布
- 切换到包的根目录
- 终端里输入
- 注意:包名不能重复
- 只能删除72个小时内发布的包
- 删除的包在24小时内不允许重复发布
模块在第一次加载后会被缓存。提高了模块的加载效率
加载优先级最高
必须指定以 或 开头的路径标识符 如果省略了文件的扩展名,则node.js会按顺序分别尝试加载以下的文件:
- 按照确切的文件名加载
- 补全.js扩展名进行加载
- 补全.json扩展名进行加载
- 补全.node扩展名进行加载
- 加载失败 终端报错
假设在 文件调用了,则Node.js会按照以下顺序查找:
- C: iankproject ode_modules ools
- C: iank ode_modules ools
- C: ode_modules ools
找不到就移动到再上一层父目录中,进行加载,直到文件系统的根目录。
专门来创建web服务器的 本质就是一个第三方包,提供了创建服务器的快速方法。和http模块类似。 express是基于http模块疯转出来的。
- 前端程序员:
- 方便、快速的创建web网站的服务器或者api接口的服务器
在根目录中,运行终端命令
res.send()方法
req.query
req.params
注意:
- 不是固定写法,例如也是可以的,最后req.params返回的为
- url也可以是这种格式,也就是说可以有多个层级,返回的数据类型为
express.static()函数,通过它,可以方便的创建一个静态资源服务器。可以将图片、css文件、JS文件对外开放。 代码示例:
游览器窗口输入即可访问目录下的index.html文件。css、图片文件同理。
现在你如果想访问anli下的index.html,那么需要输入的地址为:
能够监听项目文件的变动,当代码被修改后,nodemon会自动帮我们重启项目。
启动项目
- 按照定义的先后顺序
- 请求类型和请求url同时匹配成功,才会调用对应的处理函数
很少会把路由挂载在app上
推荐将路由抽离为单独的模块
- 创建路由模块对应的模块
- 调用函数创建路由对象
- 向路由对象上挂载具体的路由
- 使用向外共享路由对象
- 使用函数注册路由模快
代码示例:
注意: 函数的作用,就是来注册全局中间件。
为路由模块添加前缀
有输入有输出
本质上就是一个function处理函数 注意:中间件函数的形参列表中,必须包含。而路由处理函数中只包含req和res
next函数是,它表示把流转关系给下一个中间件或路由
最简单的中间件函数
客户端发起的任何请求,到达服务器之后,都会触发的中间件,叫做全局中间件。 通过app.use(中间件函数),即可定义一个全局生效的中间件。
多个中间件之间,
可以使用app.use()连续定义多个全局中间件。中间件会按照定义的顺序来执行。
不使用app.use()定义的中间件,就是局部生效的中间件,代码示例:
可以在路由中,通过如下两种的等价的方式,使用多个局部中间件:
示例:
- 一定要在路由之前注册中间件
- 不要忘记next函数
- 可以使用多个中间件进行处理请求
- next之后不要写其他的代码
- 多个中间件之间共享req,res
- 应用级别的中间件
- 路由级别的中间件
- 错误级别的中间件
- express内置的中间件
- 第三方的中间件
应用级别的中间件
通过app.use()或者app.get()或者app.post(),,叫做应用级别的中间件。
路由级别的中间件
绑定到express.Router()实例上的中间件,叫做路由级别的中间件。 它的用法和应用级别的中间件没有任何区别。 代码示例:
错误级别的中间件
专门捕捉整个项目中发生的异常错误。 格式:必须有,形参顺序从前到后,分别是(,req,res,next)
Express内置的中间件
从express4.16.0版本开始,express内置了个常用的中间件。
- express.static
- 快速托管静态资源的内置中间件
- html。文件。图片。css样式
- express.json
- 解析json格式的请求数据。
- express.urlencoded
- 解析URL-encoded格式的请求数据
express.json
express.urlencoded
- 运行
- 使用
- 在路由之前调用
跨域资源共享,游览器的默认会阻止跨域获取资源。 但是如果接口服务器,就可以解除。
Access-Control-Allow-Origin
例如:只允许来自 itcast.cn 的请求
表示运行任何域的请求
Access-Control-Allow-Headers
默认情况下,cors仅支持客户端向服务器发送的9个请求头 如果客户端向服务器发送了额外的请求头信息,需要在服务器端,通过对,否则这次请求会失败。
Access-Control-Allow-Methods
默认情况下,coes仅支持客户端发起的GET、POST、HEAD请求 如果客户端希望通过请求服务器,则需要在服务器端,通过Access-Control-Allow-Methods来指明实际请求所允许使用的HTTP方法。
简单请求
- 请求方式:GET、POST、HEAD三者之一
- HTTP头部信息不超过一下字段
预检请求
- 请求方式:GET、POST、HEAD之外的请求类型
- 请求头中包含自定义头部字段
- 向服务器发送了application/json格式的数据
正式通信之前,浏览器发送OPTION请求进行预检,来获取服务器是否允许该实际请求。
区别
预检请求会发送两次请求。
:浏览器通过。 特点:
- JSONP不属于真正的ajax请求,因为他没有使用XMLHttpRequest这个对象
- 仅支持get请求
注意事项
如果项目中已经配置了cors,为了防止冲突,必须在配置cors中间件之前声明JSONP的接口。否则JSONP接口会被处理为开启了CORS的接口。
实现jsonp接口
- 获取客户端发送过来的回调函数的名字
- 得到要通过JSONP形式发送给客户端的数据
- 根据前两部得到的数据,拼接出一个函数调用的字符串
- 把上一步拼接得到的字符串,相应给客户端的标签进行解析
- 关系型数据库
- 非关系型数据库
- 查询一个表中所有的数据
SELECT * FROM 表名称
- 查询一个表中的一列
SELECT 列名称 FROM 表名称
语法格式:
语法格式:
语法格式
例句:
and和or可在where子句中把多个条件结合起来。
对结果集进行排序,升序。降序可以使用关键字。
返回查询结果的总数居条数
- 安装操作mysql数据库的第三方模块(mysql)
- 通过mysql模块连接到mysql数据库
- 通过mysql模块执行sql语句
返回结果:
[ RowDataPacket { '1': 1 } ]
客户端的每次http请求都是独立的。。
Cookie是存储在用户游览器中的一段不超过4kb的字符串。 它由一个名称、一个值和其他几个用于控制Cookie、、的可选属性组成。 不同域名下的Cookie各自独立。每当客户端发起请求时,会自动把所有一同发送到服务器。
- 自动发送
- 域名独立
- 过期时限
- 4kb限制
客户端第一次请求服务器的时候,服务器会通过响应头,发送Cookie到游览器,游览器拿到Cookie,保存到游览器中,下一次请求的时候 ,将该Cookie放到请求头中,发送给服务器。服务器根据请求头中的Cookie验明用户的身份。
很容易被伪造。 如果把所有信息都存到cookie里面,那么敏感信息也就是存储到了客户端上,不安全。
游览器第一次请求服务器,,同时生成对应的Cookie字符串,将Cookie返回给客户端,客户端保存Cookie,下一次发送请求的时候将Cookie放到请求头中,发送给服务器,,认证成功后,将请求数据发送给客户端。
- 安装express-session中间件
- 配置express-session中间件
res.session
req.session
req.session.destory()
当前后端是跨域的时候,我们一般使用JWT认证。 JWT(JSON WEB Token)
客户端登陆,发送给服务器请求。服务器验证账号和密码,,生成后,将token发送给客户端。客户端将Token存储到LocalStorage中。客户端再次请求时,通过请求头的Authorization字段,将token发送给服务器。服务器把token字符串还原成用户的信息对象,身份认证成功后,相应给客户端对应的内容。
- Header头部
- Payload
- 真正的用户信息,用户信息加密后字符串
- Signature
三者之间用分隔。
导入jwt相关的包
- jsonwebtoken
- 生成JWT字符串的包
- express-jwt
- 将JWT字符串解析成JSON对象的包
定义secret密钥
用来加密和解密。
生成jwt字符串
调用jsonwebtoken包提供的sign()方法
将jwt字符串还原为json对象
使用req.user获取用户信息
当express-jwt这个中间件配置成功之后,就可以在那些有权限的接口中,使用req.user对象,来访问JWT字符串中解析出来的用户信息
全局错误处理中间件,捕捉JWT失败后产生的错误
到此这篇安装nodemon(安装node和npm过程)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/hd-nodejs/45011.html