You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript环境下Koa中间件修改Context类型实现请求体解析咨询

在TypeScript的Koa中扩展Context并实现请求体解析中间件

一、扩展Koa Context类型完全可行

TypeScript支持通过模块扩展增强Koa内置的DefaultContext接口,能在中间件中给ctx添加自定义属性,且让TypeScript自动识别这些属性。

步骤1:添加类型声明文件

在项目根目录创建types/koa.d.ts(没有types文件夹就新建),内容如下:

import { DefaultContext } from 'koa';

declare module 'koa' {
  interface DefaultContext {
    // 根据需求定义类型,比如支持JSON、表单或原始数据
    requestBody: Record<string, any> | string | null;
  }
}

确保tsconfig.json包含该类型文件路径,比如配置"include": ["src/**/*", "types/**/*"]。

二、实现自定义请求体解析中间件

编写中间件解析请求体并挂载到ctx.requestBody,示例:

import Koa from 'koa';

const bodyParser: Koa.Middleware = async (ctx, next) => {
  // 只处理需要请求体的HTTP方法
  if (!['POST', 'PUT', 'PATCH'].includes(ctx.method)) {
    ctx.requestBody = null;
    await next();
    return;
  }

  try {
    ctx.requestBody = await new Promise((resolve, reject) => {
      let rawData = '';
      ctx.req.on('data', chunk => rawData += chunk);
      ctx.req.on('end', () => {
        const contentType = ctx.headers['content-type'];
        // 解析JSON格式
        if (contentType?.includes('application/json')) {
          try {
            resolve(JSON.parse(rawData));
          } catch (e) {
            reject(new Error('Invalid JSON payload'));
          }
        }
        // 解析表单格式
        else if (contentType?.includes('application/x-www-form-urlencoded')) {
          resolve(Object.fromEntries(new URLSearchParams(rawData)));
        }
        // 其他格式直接返回原始字符串
        else {
          resolve(rawData);
        }
      });
      ctx.req.on('error', err => reject(err));
    });
  } catch (err) {
    ctx.status = 400;
    ctx.body = { error: (err as Error).message };
    return;
  }

  await next();
};

在路由中使用

挂载中间件后,可直接在路由处理函数中访问ctx.requestBody:

const app = new Koa();
app.use(bodyParser);

app.use(async ctx => {
  if (ctx.path === '/submit' && ctx.method === 'POST') {
    console.log('Received body:', ctx.requestBody);
    ctx.body = { status: 'success', data: ctx.requestBody };
  }
});

三、更优方案:使用成熟第三方库

手动实现适合学习场景,生产环境推荐用koa-bodyparser——它内置多种格式解析、错误处理,且自带完善的TypeScript类型支持,无需手动扩展Context。

安装依赖

npm install koa-bodyparser @types/koa-bodyparser

使用方式

import Koa from 'koa';
import bodyParser from 'koa-bodyparser';

const app = new Koa();
// 可配置解析参数,比如限制大小、支持的格式
app.use(bodyParser({ enableTypes: ['json', 'form'] }));

app.use(async ctx => {
  // 解析后的请求体直接通过ctx.request.body访问,TypeScript自动识别类型
  console.log('Parsed body:', ctx.request.body);
  ctx.body = { received: ctx.request.body };
});

内容的提问来源于stack exchange,提问作者maxwellray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:42:35