博客
关于我
nodejs系列之Koa2
阅读量:799 次
发布时间:2023-02-16

本文共 4456 字,大约阅读时间需要 14 分钟。

Koa框架入门指南

一、基本用法

1.1 架设 HTTP 服务

Koa 是一款简单高效的 Web 框架,仅需三行代码即可轻松架设一个 HTTP 服务。以下是实现步骤:

const Koa = require('koa');const app = new Koa();app.listen(3000);

运行后,打开浏览器访问 http://127.0.0.1:3000,你会看到 "Not Found" 页面。这是因为 Koa 并未指定返回内容。

通过脚手架构建服务

可以通过脚手架快速构建项目:

npm install koa-generator -g

创建项目:

koa2 -e hello-koa2

二、路由

2.1 默认路由

通过 ctx.request.path 判断请求路径,实现简单的路由:

const Koa = require('koa');const app = new Koa();const fs = require('fs');app.use(ctx => {    if (ctx.request.path !== '/') {        ctx.response.type = 'html';        ctx.response.body = 'Index Page1';    } else {        ctx.response.body = 'Hello World';    }}).listen(3000);

2.2 使用 koa-route 模块

原生路由较为复杂,推荐使用第三方模块 koa-route

const Koa = require('koa');const route = require('koa-route');const fs = require('fs');const main = route.get('/', ctx => {    ctx.response.type = 'html';    ctx.response.body = 'Index Page1';});const about = route.get('/about', ctx => {    ctx.response.body = 'Hello World';});app.use(main);app.use(about);app.listen(3000);

三、中间件

3.1 中间件的概念

中间件是 Koa 核心的灵魂,位于 HTTP 请求和响应之间。通过 app.use() 加载中间件,中间件按栈式执行。每个中间件接受 Context 对象和下一个中间件的调用。

3.2 中间件栈执行顺序

中间件执行遵循先进后出原则:

const Koa = require('koa');const one = (ctx, next) => {    console.log('> one');    next();    console.log('< one');};const two = (ctx, next) => {    console.log('> two');    next();    console.log('< two');};const three = (ctx, next) => {    console.log('> three');    next();    console.log('< three');};app.use(one);app.use(two);app.use(three);app.listen(3000);

执行结果为:

> one > two > three < three < two < one

3.3 异步中间件

对于需要异步操作的中间件,需标记为 async 函数:

const fs = require('fs.promised');const Koa = require('koa');const main = async (ctx, next) => {    ctx.response.type = 'html';    ctx.response.body = await fs.readFile('./demos/template.html', 'utf8');};app.use(main);app.listen(3000);

3.4 中间件合成

使用 koa-compose 模块合成为一个中间件:

const Koa = require('koa');const compose = require('koa-compose');const logger = (ctx, next) => {    console.log(`${Date.now()} ${ctx.request.method} ${ctx.request.url}`);    next();};const main = ctx => {    ctx.response.body = 'Hello World';};const middlewares = compose([logger, main]);app.use(middlewares);app.listen(3000);

四、错误处理

4.1 500 错误

使用 ctx.throw() 方法抛出错误:

const Koa = require('koa');const app = new Koa();const main = ctx => {    ctx.throw(500);};app.use(main);app.listen(3000);

4.2 404 错误

手动设置响应状态码:

const Koa = require('koa');const app = new Koa();const main = ctx => {    ctx.response.status = 404;    ctx.response.body = 'Page Not Found';};app.use(main);app.listen(3000);

4.3 错误处理中间件

使用中间件捕获错误:

const Koa = require('koa');const app = new Koa();const handler = async (ctx, next) => {    try {        await next();    } catch (err) {        ctx.response.status = err.statusCode || 500;        ctx.response.body = { message: err.message };    }};const main = ctx => {    ctx.throw(500);};app.use(handler);app.use(main);app.listen(3000);

4.4 错误事件监听

监听 Koa 的错误事件:

const Koa = require('koa');const app = new Koa();const main = ctx => {    ctx.throw(500);};app.on('error', (err, ctx) => {    console.error('server error', err);});app.use(main);app.listen(3000);

五、Web 应用功能

5.1 Cookies

通过 ctx.cookies 管理 Cookie:

const Koa = require('koa');const app = new Koa();const main = (ctx) => {    const views = ctx.cookies.get('view') || 0;    ctx.cookies.set('view', views + 1);    ctx.response.body = `${views + 1} views`;};app.use(main);app.listen(3000);

5.2 表单处理

使用 koa-body 模块处理 POST 请求:

const Koa = require('koa');const koaBody = require('koa-body');const app = new Koa();const main = async (ctx) => {    const body = ctx.request.body;    if (!body.name) {        ctx.throw(400, '.name required');    }    ctx.body = { name: body.name };};app.use(koaBody());app.use(main);app.listen(3000);

5.3 文件上传

处理文件上传:

const os = require('os');const path = require('path');const fs = require('fs');const Koa = require('koa');const koaBody = require('koa-body');const app = new Koa();const main = async (ctx) => {    const tmpdir = os.tmpdir();    const filePaths = [];    const files = ctx.request.body.files || {};    for (let key in files) {        const file = files[key];        const filePath = path.join(tmpdir, file.name);        const reader = fs.createReadStream(file.path);        const writer = fs.createWriteStream(filePath);        reader.pipe(writer);        filePaths.push(filePath);    }    ctx.body = filePaths;};app.use(koaBody({ multipart: true }));app.use(main);app.listen(3000);

转载地址:http://hxjfk.baihongyu.com/

你可能感兴趣的文章
Node-RED中使用node-red-browser-utils节点实现选择Windows操作系统中的文件并实现图片预览
查看>>
Node-RED中使用Notification元件显示警告讯息框(温度过高提示)
查看>>
Node-RED中实现HTML表单提交和获取提交的内容
查看>>
Node.js 函数是什么样的?
查看>>
Node.js 历史
查看>>
Node.js 在个推的微服务实践:基于容器的一站式命令行工具链
查看>>
Node.js 实现类似于.php,.jsp的服务器页面技术,自动路由
查看>>
node.js 怎么新建一个站点端口
查看>>
Node.js 文件系统的各种用法和常见场景
查看>>
node.js 简易聊天室
查看>>
node.js 配置首页打开页面
查看>>
node.js+react写的一个登录注册 demo测试
查看>>
Node.js中环境变量process.env详解
查看>>
Node.js卸载超详细步骤(附图文讲解)
查看>>
Node.js安装与配置指南:轻松启航您的JavaScript服务器之旅
查看>>
Node.js安装及环境配置之Windows篇
查看>>
Node.js安装和入门 - 2行代码让你能够启动一个Server
查看>>
node.js安装方法
查看>>
Node.js的循环与异步问题
查看>>
Node.js高级编程:用Javascript构建可伸缩应用(1)1.1 介绍和安装-安装Node
查看>>