NODE分享
这次的周分享虽迟但到
大家端午假期过得怎么样呐
表哥们可一直在实验室搬砖
话不多说
看表哥们假期里搬砖的成果吧~
01
API
API(Application Programming Interface,应用程序编程接口)是一种定义了软件系统中不同组成部分交互的方式的接口。简单来说,API指的是一组定义了软件应用程序之间交互的规则、协议和工具。API提供了一种方便的方式,使各个软件系统之间进行交互和通信更加容易。API可以帮助开发人员将不同的应用程序、系统和服务集成到一起,从而实现更加复杂的业务流程和功能。
API组成
* 请求方法
* 接口地址
* 请求参数
* 响应结果
RESTful API
RESTful API是一种API规范
* URL中的路径表示资源,路径中不能有动词
* 操作资源与HTTP请求方法相对应
* 操作结果与HTTP响应状态码对应
| 操作 | 请求类型 | URL | 返回 |
| ------------ | -------- | -------- | -------------------- |
| 新增歌曲 | POST | /song | 返回新生成的歌曲信息 |
| 删除歌曲 | DELETE | /song/10 | 返回一个空文档 |
| 修改歌曲 | PUT | /song/10 | 返回更新后的歌曲信息 |
| 修改歌曲 | PATCH | /song/10 | 返回更新后的歌曲信息 |
| 获取所有歌曲 | GET | /song | 返回歌曲列表数组 |
| 获取单个歌曲 | GET | /song/10 | 返回单个歌曲信息 |
接口测试工具
* apipost
* apifox
* postman
02
会话控制
* cookie
Cookie 是在客户端(浏览器)保存用户信息的一种机制,它可以记录用户的登录状态、喜好设置等信息。当用户访问网站时,服务器会将 Cookie 发送给客户端,客户端会保存 Cookie,下次访问同一网站时会自动带上该网站的 Cookie。Cookie 有一些局限性,如容量和安全性等,同时也存在被篡改和盗用的风险
* session
Session 是在服务器端保存用户信息的一种机制,它可以记录用户的登录状态、购物车等信息。当用户访问网站时,服务器会创建一个 Session,并将 Session ID 发送给客户端,客户端会保存 Session ID,下次访问同一网站时会将该 Session ID 发送给服务器。Session 相对于 Cookie 更加安全,但是也存在一些问题,如负载均衡和集群环境下的问题。
* token
Token 是一种在客户端和服务器之间传递安全信息的一种机制,它是由服务器颁发给客户端的一串字符串,客户端在后续的请求中会带上该 Token,服务器通过验证 Token 的有效性来实现用户认证和授权。Token 相对于 Cookie 和 Session 更加安全,也更加灵活,可以用于跨域访问和移动端应用程序等场景。
JWT
JWT是json web token缩写,是目前最流行的跨域认证解决方案,用于基于token的身份验证,使得token的生成和校验更加规范.
JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部包含算法和 Token 类型等信息,载荷包含用户信息和权限等信息,签名则使用头部信息、载荷信息和密钥生成的哈希值,用于验证 Token 的合法性。
### 举个例子
```js
//登录操作
router.post('/login', (req, res) => {
let {username, password} = req.body;
RegModel.findOne({username: username, password: md5(password)}).then((data ,err) => {
if(err){
res.json({
code: '2001',
msg: '读取失败',
data: null
})
}
//判断是否存在数据
//console.log(data);
if(!data){
res.json({
code: '2002',
msg: '用户名和密码错误',
data: null
})
}else{
let token = jwt.sign({
username: data.username,
password: data.password,
_id: data._id
}, secretKey, {
expiresIn: 60 * 60 * 24 * 7 //七天
});
res.json({
code: '0000',
msg: '登陆成功',
data: token
})
}
})
});
```
###优缺点
JWT 的优点:
1. 跨平台和语言:JWT 是通过 JSON 格式传输数据的,可以被几乎所有编程语言支持。
2. 自包含:JWT 包含了所有需要的信息,避免了频繁的查询数据库。
3. 安全性高:JWT 的签名可以保证 Token 的真实性和完整性,防止被篡改。
4. 可扩展性好:JWT 可以很容易地添加自定义信息。
缺点:
1. Token 信息暴露:JWT 中的信息是以明文形式传输的,如果 Token 被盗取,那么所有信息都会暴露。
2. Token 无法被撤销:JWT 一旦颁发,就无法被撤销或废除,除非 Token 过期或者重新颁发一个新的 Token。
3. Token 过期问题:JWT Token 无法控制客户端的过期时间,只能控制服务端的过期时间。如果客户端长时间不使用,Token 也可能过期。
4. 服务端存储问题:JWT Token 的签名需要使用服务端的密钥来生成,服务端需要保存密钥,从而增加了服务端的负担。
5. 不适用于高安全性场景:JWT 虽然可以使用加密算法进行签名,但并不适用于高安全性场景,如金融领域等。
03
Express
express路由基本结构
```js
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
或者:
router.get('/reg', (req, res) => {
res.render('auth/reg');
});
```
采用的是`function(err, req, res, next)`或者`(req, res) =>`的方式进行函数回调,其中res和req代表响应和请求的信息.
中间件
中间件的本质是一个回调函数;中间件函数可以像路由一样范围跟req和res
中间件可以使用函数封装公共操作,简化代码
* 全局中间件,所有请求都会使它执行
* 路由中间件,在满足条件的所在路由中执行
每一个请求到达服务端后都会执行全局中间件函数
* 静态资源中间件 index.html为默认打开的资源
* 静态资源和路由规则同时匹配,谁先匹配谁先响应
* 路由相应动态资源,静态资源中间件响应静态资源
### 简单实现
```js
const jwt = require('jsonwebtoken');
const {secretKey} = require('../config/config');
module.exports = (req, res, next) => {
let token = req.get('token');
if(!token){
res.json({
code: '2003',
msg: '没有token啊啊啊',
data: null
})
}else{
jwt.verify(token, secretKey, (err, data) => {
if(err){
res.json({
code: '2004',
msg: 'token出错啦~~',
data: null
})
}else{
//保存用户的信息
req.userinfo = data;
next();
}
})
}
}
```
此时在路由中加入中间件就行:
```js
router.get('/lists', tokencheckmiddleware, function(req, res, next) {
//let lists = db.get('accounts').value();
ListsModel.find().sort({time: -1}).then((data, err) => {
if(err){
res.json({
code: '1001',
msg: '读取失败',
data: null
})
return;
}
res.json({
code: '0000',//一般用这个表示成功或者用20000
msg: '读取成功',
data: data
})
})
});
```
EJS模板引擎
模板引擎是分离用户界面和业务数据的一种技术
EJS (Embedded JavaScript templating) 是一种高效的JavaScript 模板引擎,它可以帮助我们在 Node.js 应用中生成 HTML 页面。EJS 支持嵌套模板、模板继承、动态数据绑定等功能。我们可以使用类似 JavaScript 的语法编写模板文件,通过对模板文件中的变量进行赋值,生成最终的 HTML 页面。
###简单实现
首先创建一个ejs文件,在我们想要输入数据的地方加上特殊格式,例如:
```js
<%= message %>
<%= error.status %>
<%= url %>
```
在使用的地方使用render函数,例如:
`res.render('success', {url: '/lists'});`
即可实现后端与前端页面的连接关系
04
Koa2+promise
promise
Promise 对象是一种 JavaScript 异步编程的解决方案,它是 ES6 引入的一个新特性,可以更优雅地处理异步操作。Promise 对象可以看作是一个承诺,表示某个操作将来会完成,并且提供了一组 API 来处理异步操作的状态(进行中、已完成、已失败),使得异步操作更加可控。
Promise 对象有三种状态:
* Pending(进行中):初始状态,表示异步操作还没有完成。
* Fulfilled(已完成):表示异步操作已经完成,并且成功地返回了结果。
* Rejected(已失败):表示异步操作已经完成,并且返回了一个错误信息。
Promise 对象一旦被创建,就可以通过链式调用的方式串联多个异步操作,形成一个操作序列。在操作序列中,每个操作都会返回一个新的 Promise 对象,以便后续操作使用。
Promise 对象的语法如下:
```
const promise = new Promise((resolve, reject) => {
// 异步操作
if (异步操作成功) {
resolve(操作结果);
} else {
reject(错误信息);
}
});
promise.then((操作结果) => {
// 对操作结果的处理
}).catch((错误信息) => {
// 对错误信息的处理
});
```
在 Promise 对象的构造函数中,我们需要传入一个异步操作的函数,该函数接受两个参数 `resolve` 和 `reject`,分别表示异步操作成功和失败时的回调函数。在异步操作完成后,如果成功地返回了结果,则调用 `resolve` 函数并传入操作结果,否则调用 `reject` 函数并传入错误信息。
在异步操作序列中,我们可以通过 `then` 方法来执行下一步操作,并传入成功返回的操作结果。如果前面的操作返回了错误信息,则可以通过 `catch` 方法来处理错误信息。
总的来说,Promise 对象可以大大简化异步编程中的回调地狱(Callback Hell)问题,使得代码更加清晰、易于维护。
Kao2
在Koa2中,async和await是常用的语法糖。使用它们可以以异步的方式来处理请求和响应,并且让代码具有更好的可读性和维护性。
### async
async是一个关键字,可以将函数声明为==异步函数==。异步函数会返回一个Promise对象,并且可以在函数体内使用await关键字来等待Promise对象的解析结果。
例如:
```js
async function getData() {
const result = await axios.get('http://example.com/data');
return result.data;
}
```
在这个例子中,我们定义了一个名为getData的异步函数。在函数体内部,我们使用axios发起一个http请求获取数据。由于axios.get方法返回的是一个Promise对象,因此我们可以使用await关键字来等待其解析结果。一旦返回结果,我们就可以从中提取出需要的数据并将其返回。
### await
await是一个关键字,可以用在异步函数内部,用于暂停函数执行,等待某个Promise对象的状态变为resolved后再继续执行。它只能在异步函数内部使用。
例如:
```js
async function getData() {
const result = await axios.get('http://example.com/data');
return result.data;
}
```
在这个例子中,我们在异步函数体内使用了await关键字,在等待axios.get方法的返回结果时,函数会被挂起。一旦请求返回并解析完成,函数会继续执行,并将解析结果返回给调用方。
使用async/await时需要注意以下几点:
1. async只能修饰函数:使用async时,只能将其声明在函数前,用于对该函数进行异步操作。如果想对其他部分进行异步操作,比如循环,可以使用Promise.all。
2. await只能在async方法中使用:await必须在async方法中使用,并且只有Promise类型的操作才能够使用await,否则会抛出错误。
3. async函数总是返回一个Promise对象,无论是否显式地return一个Promise对象或者任意其他值,都会被包装成Promise对象返回。
4. await会阻塞当前函数的执行,直到等待的结果返回后再继续执行,因此需要注意不要过多使用await语句,以免导致程序性能下降。
5. 使用try...catch...来捕获任何可能产生错误的异步操作,避免程序崩溃。
6. 注意回调地狱问题(callback hell): 在处理复杂的异步链式调用时,应当合理地组织代码结构,使其易于维护和扩展,避免产生回调地狱的情况。
包
### koa-views
`koa-views`是一个koa的模板渲染中间件,使用koa-views中间件,可以和其它的模板引擎一起结合使用。也就是可以在Koa里使用模板引擎生成html页面,然后返回给到客户端
### path.join
`path.join()` 方法使用特定于平台的分隔符作为定界符将所有给定的 `path` 片段连接在一起,然后规范化生成的路径。
零长度的 `path` 片段被忽略。如果连接的路径字符串是零长度字符串,则将返回 `'.'`,表示当前工作目录。
```js
path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// Returns: '/foo/bar/baz/asdf'
```
### koa-json
用于将JavaScript对象转换为JSON格式并作为HTTP响应发送回客户端。它可以使代码更加简洁和易读,减少手动编写JSON字符串的工作量,并且可以自动设置正确的Content-Type头部。
### koa-onerror
1. 拦截koa应用程序中的错误和异常,并将它们转换为HTTP响应发送回客户端;
2. 提供定制化的错误处理方式,例如自定义错误页面、日志记录等;
3. 简化代码编写,避免重复编写错误处理代码。
### koa-bodyparser
用于解析HTTP请求中的JSON、表单和文本等数据,并将它们转换为JavaScript对象。使用koa-bodyparser可以让我们以一种更加简单和高效的方式获取客户端提交的数据,从而使代码编写更加容易和快捷。
### koa-logger
用于记录HTTP请求的日志。使用koa-logger可以方便我们查看应用程序的运行状态和调试问题,并且可以提高代码的可读性和可维护性。
### koa-static
当客户端请求静态资源时,koa-static中间件会自动查找指定目录下的文件,并将其返回给客户端。同时,由于启用了缓存机制,客户端再次请求同一文件时,浏览器会从本地缓存读取,避免了不必要的HTTP请求。
好啦 本周内容到此结束~
我们下周不见不散~
马上考试周了 大家复习加油!!
记得长按下方二维码关注我们呦
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...