1. 使⽤用过的koa2中间件
• koa-router:路由管理工具;
• koa-bodyparser:将request中的请求体解析到ctx.request.body中;
• koa-session:提供session支持;
• koa-static:静态文件服务器;
• koa-compress:对响应内容压缩;
• koa-jwt:提供JSON Web Token认证支持;
• koa-cors:允许跨域请求
2. koa-body原理
koa-body是一个koa2中间件,用于解析HTTP请求中的请求体,并将解析后的内容存储在ctx.request.body中,方便后续的处理。koa-body支持多种请求体格式,包括JSON、form、text、multipart和XML等格式。
koa-body不是koa2的核心模块,而是第三方中间件,其原理基于koa2的洋葱模型,也就是中间件机制。具体来说,koa-body将自己注册为koa2应用的一个中间件,在请求到达koa2应用时,koa-body中间件首先会判断请求的Content-Type,然后根据Content-Type调用相应的解析函数解析请求体,最后将解析后的结果存储在ctx.request.body中,并重新洋葱模型的下一个中间件处理请求。
由于koa-body内部调用了Koa的内置中间件querystring和co-body,这两个中间件实现了请求体的解码和解析,因此koa-body的原理就是基于querystring和co-body实现的
3. 介绍⾃⼰写过的中间件
分享一个我曾经编写的koa2中间件,它主要是用于Axios请求缓存。
中间件主要作用是:在客户端请求数据的时候,如果本地缓存存在,就会直接返回缓存的数据,否则就会发送请求获取新数据。
以下是这个中间件的代码示例:
const NodeCache = require(‘node-cache’);
// 创建缓存对象
const cache = new NodeCache({ stdTTL: 600 });
module.exports = function axiosCache() {
return async (ctx, next) => {
const cacheKey = ${ctx.request.url}@${ctx.request.method}
;
const cachedBody = cache.get(cacheKey);
if (cachedBody) { // 如果缓存存在则直接返回
ctx.body = cachedBody;
} else {
await next();
// 存储请求的结果到缓存中
cache.set(cacheKey, ctx.body);
}
};
}
使用该中间件时,仅需在Koa2应用的路由前使用该中间件即可。一般情况下,我们会将客户端发起的HTTP请求的URL和method作为cache的Key,并将请求的结果缓存起来。当下次请求的时候,在缓存中查找,如果存在则直接返回缓存的结果,否则再发起新的请求并缓存结果。这样可以减少客户端请求的次数和服务端的负担,提高系统的性能。
4. 有没有涉及到Cluster
Cluster是一个Node.js自带的内置模块,它可以让Node.js应用在多个进程中运行,从而充分利用多核CPU的优势提高应用的性能和稳定性。也就是说,Cluster可以将一个Node.js应用拆分成多个子进程运行,每个子进程分担一个或多个请求的处理,从而实现并行处理请求的效果。
在我的开发经验中,我曾经使用Cluster来优化一个用Koa2实现的Web服务。由于需要处理大量的并发请求,单核的Node.js应用无法满足我们的需求,因此我们使用Cluster将Node.js应用拆分成多个子进程运行,利用多核CPU来提高应用的性能和稳定性。我们使用了pm2管理进程,并采用负载均衡策略将请求均衡地分配给子进程处理,最终达到了提高服务器的吞吐率和响应速度的目的。
需要注意的是,使用Cluster需要注意进程之间的资源共享和同步,避免出现竞态条件和死锁等问题。同时,也需要充分利用系统资源来平衡各个子进程的负载,达到最优的性能表现。
5. 介绍pm2
PM2是一个Node.js应用的进程管理器,可以管理和监控Node.js应用的运行状态,能够自动重启应用,保证应用的高可用性。PM2具有多进程、负载均衡、0秒停机重载、进程守护、日志管理等众多功能,能够帮助开发者轻松地管理Node.js应用。
以下是PM2的一些常用功能:
-
启动和停止进程:可以使用PM2来启动和停止Node.js应用的进程,也可以重启、重载和更新进程。
-
进程管理:PM2通过CLI界面、API接口和Web UI方式展示、管理和监控Node.js应用的进程。
-
负载均衡和多进程:可以通过PM2在多个子进程中运行Node.js应用,利用多核CPU来提高应用的性能。
-
守护进程:通过PM2的守护进程模式,可以让Node.js应用在后台运行,保持进程的持续性并保证应用的高可用性。
-
日志管理:PM2可以自动收集并记录应用的日志,方便开发者排查问题和分析应用性能。
需要注意的一点是,PM2并不是Node.js的核心模块,而是一个第三方模块,需要通过npm安装。使用PM2可以大大提升Node.js应用的管理和监控能力,提高应用的可靠性和稳定性。 -
master挂了了的话pm2怎么处理
使用PM2管理Node.js应用,当Master进程挂掉时,PM2会自动将已经运行的Node.js应用迁移到其他子进程中,保证服务的持续性和高可用性。这是因为PM2的进程管理模块默认启用了Cluster模式,在Cluster模式下,每个子进程是互相独立的,如果Master进程挂掉,子进程可以自动接管已有的任务和连接,实现高效的容错和恢复机制。
当Master进程挂掉后,PM2会启动一个新的Master进程,并将子进程重新绑定到新的Master进程上。如果某个子进程也出现了问题,PM2会自动重新启动该子进程,保持服务的正常运行。
需要注意的是,当Master挂掉时可能会存在一定的风险,例如没有处理完的请求将会被中断,PM2也可能会出现异常行为。因此在实际应用中,我们需要保证Master进程的稳定性,并且根据具体情况设置合适的PM2健康检查与重启策略,以确保Node.js应用的高可用性和稳定性
7. 如何和MySQL进行通信
要和MySQL进行通信,需要在Node.js应用中安装mysql模块。可以使用npm进行安装,命令如下:
npm install mysql --save
安装完成后,可以在Node.js应用中使用以下代码进行MySQL的连接和通信:
const mysql = require(‘mysql’);
// 创建MySQL连接对象
const connection = mysql.createConnection({
host: ‘localhost’,
user: ‘root’,
password: ‘your_password’,
database: ‘your_database_name’
});
// 连接MySQL数据库
connection.connect();
// 执行SQL查询操作
connection.query(‘SELECT * FROM your_table_name’, function (error, results, fields) {
if (error) throw error;
console.log('The result is: ', results);
});
// 断开MySQL连接
connection.end();
以上代码中,我们首先创建了一个MySQL连接对象,在其中设置了MySQL数据库的连接参数,例如数据库的主机名、用户名、密码和数据库名称等。然后使用connect()方法连接MySQL数据库,query()方法执行SQL查询,并在回调函数中处理查询结果。最后使用end()方法断开MySQL数据库连接。
8. React声明周期及自己的理解
React组件的生命周期可以分为3个阶段:组件挂载阶段、组件更新阶段和组件卸载阶段。
下面是React组件的生命周期方法:
- constructor():组件创建时被调用,用来初始化state和绑定事件处理函数等;
- static getDerivedStateFromProps():该方法在调用render()方法前被调用,用来根据props来更新state;
- render():该方法用来生成组件的虚拟DOM结构;
- componentDidMount():组件挂载后被调用,通常在该方法中进行网络请求和DOM操作等初始化操作;
- shouldComponentUpdate():在更新阶段中,该方法会在调用render()方法前被调用,用来判断是否需要进行重新渲染。可以通过return false来阻止组件的重新渲染;
- static getSnapshotBeforeUpdate():该方法在调用render()方法前被调用,用来获取组件更新前的DOM状态。该方法的返回值会作为componentDidUpdate()方法的第三个参数传入;
- componentDidUpdate():组件更新后被调用,通常在该方法中进行网络请求和DOM操作等更新操作;
- componentWillUnmount():组件卸载时被调用,通常在该方法中清除定时器和销毁需要释放的资源等。
我的理解是:React组件的生命周期可以用来控制组件的创建、更新和销毁等过程。在组件的生命周期方法中,可以对组件的状态进行初始化、更新和销毁等操作,从而实现更加灵活的组件管理和控制。在实际应用中,需要根据业务需求和组件的特性来选择合适的生命周期方法进行处理。同时,在组件的更新过程中,尽量减少虚拟DOM的操作,可以提高React应用的性能和响应速度