认识node.js
Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于Chrome V8引擎的JavaScript运行时环境,使用了一个事件驱动、非阻塞式I/O模型,通过Node.js JavaScript不再局限于浏览器环境,可以广泛应用于服务器端开发。
node.js的框架
koa.js基础搭建
安装koa
1、mkdir mykoa
2、cd mykoa
3、npm init -y
4、npm install koa
目录结构
创建基本的koa应用
const Koa = require('koa');
const app = new Koa();
app.listen(3000, () => {
console.log('Server is running at http://localhost:3000');
});
Koa 应用程序不是 HTTP 服务器的1对1展现。 可以将一个或多个 Koa 应用程序安装在一起以形成具有单个HTTP服务器的更大应用程序。创建并返回 HTTP 服务器,将给定的参数传递给 Server#listen()。 端口号:这是必须的参数,用于指定服务器监听的端口。例如,app.listen(3000)表示服务器将监听3000端口。 回调函数:这是一个可选参数,当服务器成功监听指定端口后,会执行这个回调函数。例如,app.listen(3000, () => console.log('服务器运行在 http://localhost:3000')) 会在服务器启动后打印一条消息到控制台。 app.listen()方法实际上是http.createServer(app.callback()).listen(...)的语法糖。
处理静态资源
如果我们想让服务给我们返回文件或图片,我们可以用koa-static来实现
const Koa = require('koa');
const serve = require('koa-static');
const app = new Koa();
// 注册静态资源中间件
app.use(serve('public'));
app.listen(3000, () => {
console.log('Server is running at http://localhost:3000');
});
中间件是 Koa 的一大特色,它让你能够添加各种功能,比如日志记录、解析请求体等。Koa中间件的工作原理是通过一个函数链来处理HTTP请求。每个中间件函数接收两个参数:一个是要处理的请求上下文(context),另一个是next函数,用于调用下一个中间件。中间件可以同步或异步地处理请求,并通过调用next()来将控制权传递给下一个中间件。这种机制被称为“洋葱模型”,因为请求和响应的处理过程像剥洋葱一样一层层地进行,先进后出。
我们可以通过app.use(function)添加中间件,
function接收两个参数 ctx(上下文对象)和 next(一个函数,用于调用下一个中间件)。
- ctx 包含了请求和响应的信息,可以通过它访问请求对象 ctx.request 和响应对象 ctx.response。例如,在中间件中修改 ctx.body 来设置响应内容,或者通过 ctx.params 获取路由参数等。
- next 函数用于调用下一个中间件。当在一个中间件中调用 next() 时,Koa 会暂停当前中间件的执行,将请求传递给下一个中间件。当后续的中间件都执行完毕后,Koa 会回溯回来继续执行当前中间件中 next() 之后的代码。
我们来自己实现一个记录接口请求时间的中间件
const timeFn = async (ctx, next) => {
const start = new Date();
let ms;
await next();
ms = new Date() - start;
console.log(ms, 'ms')
};
app.use(timeFn);
使用路由
这里路由是用来定义接口的,我们需要安装koa-router这个中间件来帮助我们实现接口
get请求
const Koa = require('koa');
const app = new Koa();
const Router = require('koa-router')
const router = new Router();
router.get('/about',(ctx, next)=>{
ctx.body = 'this is a project about web'
console.log(ctx.request.query)
next()
})
router.get('/login/:id/:name',(ctx,next)=>{
console.log(ctx.params)
ctx.body = 'this is a project login web'
next();
})
app.use(router.routes()).use(router.allowedMethods());
app.listen(3000, () => {
console.log('Server is running at http://localhost:3000');
});
post请求
const bodyParser = require('koa-bodyparser');
app.use(bodyParser());
router.post('/user',(ctx)=>{
ctx.body = {
data: '请求成功了!'
}
ctx.response.set({'Content-Type': 'text/html'})
ctx.response.message = 'cuole'
console.log(ctx.request.body)
})
app.use(router.routes()).use(router.allowedMethods());
post请求我们需要通过koa-bodyparser这个中间件才能拿到处理好的参数
响应
- response.set: 设置响应头对象。
- response.status: 设置响应状态。
- response.body: 设置响应主体。
- response.message: 设置响应状态消息
错误处理
koa中我们可以使用try...catch语句来捕获错误
const errorFn = async (ctx, next) => {
try {
await next();
} catch (err) {
ctx.status = err.statusCode || 500;
ctx.body = '系统报错了啊啊啊啊!';
}
}
app.use(errorFn);
node.js事件循环机制
事件循环的基本概念
Node.js的事件循环机制是Node.js处理异步任务的核心机制。事件循环是一个连续运行的半无限循环,只要存在挂起的异步操作,它就会运行。事件循环的主要目的是确保Node.js能够高效地处理大量的并发请求,同时避免阻塞主线程。
事件循环的工作原理可以类比为餐厅经理,将任务分配给对应的服务员,比如点餐就交给点餐的服务员,上菜就交给上菜的服务员等。在Node.js中,事件循环负责处理各种异步任务,如文件读写、网络请求等。当一个异步任务完成时,它的回调函数会被放入事件队列中,等待事件循环处理。
Node.js的事件循环主要阶段
- Timers:处理setTimeout和setInterval的回调函数。
- Pending callbacks:执行系统级别的回调,如TCP连接失败的回调。
- Idle/Prepare:仅供Node内部使用。
- Poll:处理I/O操作的回调,如文件和网络I/O(除timers、check之外的回调存放在这里)。
- Check:执行setImmediate的回调函数(是一个在 Node.js 环境中使用的函数,适用于需要尽快在当前事件循环之后执行的场景。它不接受延迟时间作为参数,而是立即将回调函数放入队列中等待执行)。
- Close callbacks:执行关闭请求的回调,如socket.on('close', ...)。
我们需要了解一下node的循环机制
从主线程进时间循环超过1ms那就是settimeout块,反之setImmediate
每一个阶段都会维护一个事件队列,可以把每一个圈想象成一个事件队列。 有个setTimeout(10s) 到timers倒计时还没结束 timers没有东西 就进入poll阶段 poll持续轮训检查 timers和check是否有回调,如果没有 就会在poll一直轮询检查 timers有东西了进入下一阶段轮训 重新进入timers 当timers回调执行完毕 重新进入poll 在持续检查 直到有下一个回调触发。