82 # koa-bodyparser 中间件的使用以及实现

准备工作

安装依赖

bash 复制代码
npm init -y
npm i koa

koa 文档:https://koajs.cn/#

koa 中不能用回调的方式来实现,因为 async 函数执行的时候不会等待回调完成

js 复制代码
app.use(async (ctx, next) => {
    console.log(ctx.path, ctx.method);
    if (ctx.path == "/login" && ctx.method === "POST") {
        const arr = [];
        ctx.req.on("data", function (chunk) {
            arr.push(chunk);
        });
        ctx.req.on("end", function () {
            const result = Buffer.concat(arr).toString();
            console.log("result---->", result);
            ctx.body = result;
        });
    } else {
        next();
    }
});

koa 中所有的异步都必须是 promise,只有 promise 才有等待效果,必须所有的 next 方法前需要有 await、return 否则没有等待效果

js 复制代码
app.use(async (ctx, next) => {
    console.log(ctx.path, ctx.method);
    if (ctx.path == "/login" && ctx.method === "POST") {
        await new Promise((resolve, reject) => {
            const arr = [];
            ctx.req.on("data", function (chunk) {
                arr.push(chunk);
            });
            ctx.req.on("end", function () {
                const result = Buffer.concat(arr).toString();
                console.log("result---->", result);
                ctx.body = result;
                resolve();
            });
        });
    } else {
        await next();
    }
});

实现一个表单提交功能 server.js

javascript 复制代码
const Koa = require("koa");

const app = new Koa();

app.use((ctx, next) => {
    // 路径是 /login get 方式
    // ctx 包含了 request response req res
    console.log(ctx.path, ctx.method);
    if (ctx.path == "/login" && ctx.method === "GET") {
        ctx.body = `
            <form action="/login" method="post">
                用户名:<input type="text" name="username"/><br/>
                密码:<input type="password" name="password"/><br/>
                <button>提交</button>
            </form>
        `;
    } else {
        return next();
    }
});

app.use(async (ctx, next) => {
    console.log(ctx.path, ctx.method);
    if (ctx.path == "/login" && ctx.method === "POST") {
        await new Promise((resolve, reject) => {
            const arr = [];
            ctx.req.on("data", function (chunk) {
                arr.push(chunk);
            });
            ctx.req.on("end", function () {
                const result = Buffer.concat(arr).toString();
                console.log("result---->", result);
                ctx.body = result;
                resolve();
            });
        });
    } else {
        await next();
    }
});

app.on("error", function (err) {
    console.log("error----->", err);
});

app.listen(3000);

启动服务,访问 http://localhost:3000/login

bash 复制代码
nodemon server.js

输入账号密码,点击提交

koa-bodyparser

下面使用 koa-bodyparser 简化逻辑,安装 koa-bodyparserhttps://www.npmjs.com/package/koa-bodyparser

bash 复制代码
npm i koa-bodyparser

用法:

js 复制代码
const Koa = require('koa');
const bodyParser = require('koa-bodyparser');

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

app.use(async ctx => {
  // the parsed body will store in ctx.request.body
  // if nothing was parsed, body will be an empty object {}
  ctx.body = ctx.request.body;
});

业务里添加逻辑

javascript 复制代码
const Koa = require("koa");
const bodyParser = require("koa-bodyparser");
const app = new Koa();
app.use(bodyParser());

app.use((ctx, next) => {
    // 路径是 /login get 方式
    // ctx 包含了 request response req res
    console.log(ctx.path, ctx.method);
    if (ctx.path == "/login" && ctx.method === "GET") {
        ctx.body = `
            <form action="/login" method="post">
                用户名:<input type="text" name="username"/><br/>
                密码:<input type="password" name="password"/><br/>
                <button>提交</button>
            </form>
        `;
    } else {
        return next();
    }
});

app.use(async (ctx, next) => {
    console.log(ctx.path, ctx.method);
    if (ctx.path == "/login" && ctx.method === "POST") {
        ctx.body = ctx.request.body;
    } else {
        await next();
    }
});

app.on("error", function (err) {
    console.log("error----->", err);
});

app.listen(3000);

效果也是一样的

下面自己实现 koa-bodyparser

javascript 复制代码
const querystring = require("querystring");
console.log("使用的是 kaimo-koa-bodyparser 中间件");
// 中间件的功能可以扩展属性、方法
module.exports = function () {
    return async (ctx, next) => {
        await new Promise((resolve, reject) => {
            const arr = [];
            ctx.req.on("data", function (chunk) {
                arr.push(chunk);
            });
            ctx.req.on("end", function () {
                if (ctx.get("content-type") === "application/x-www-form-urlencoded") {
                    const result = Buffer.concat(arr).toString();
                    console.log("kaimo-koa-bodyparser-result---->", result);
                    ctx.request.body = querystring.parse(result);
                }
                resolve();
            });
        });
        await next(); // 完成后需要继续向下执行
    };
};

将业务代码的引用自己实现的

javascript 复制代码
// 使用自己实现的 koa-bodyparser
const bodyParser = require("./kaimo-koa-bodyparser");

启动服务,效果一样:

相关推荐
你真的可爱呀17 小时前
2.Express 核心语法与路由
中间件·node.js·express
feathered-feathered18 小时前
Redis【事务】(面试相关)与MySQL相比较,重点在Redis事务
android·java·redis·后端·mysql·中间件·面试
音符犹如代码19 小时前
深入解析 Apollo:微服务时代的配置管理利器
java·分布式·后端·微服务·中间件·架构
IMPYLH1 天前
Lua 的 Coroutine(协程)模块
开发语言·笔记·后端·中间件·游戏引擎·lua
脸大是真的好~2 天前
黑马消息队列-rabbitMQ2-生产者重连机制-生产者确认机制-数据持久化-LazyQueue-消费者确认机制-失败重试机制-重试耗尽告警手动处理-
java·缓存·中间件
闲人编程2 天前
中间件开发与生命周期管理
缓存·中间件·生命周期·日志·扩展·codecapsule
添加shujuqudong1如果未回复3 天前
用蜣螂优化(DBO)算法攻克置换流水车间调度问题
中间件
写代码的小阿帆3 天前
消息队列中间件RabbitMQ基础——Spring AMQP、路由模型到可靠性
中间件·rabbitmq·java-rabbitmq
pixle05 天前
从零学习Node.js框架Koa 【七】Koa实战:构建企业级邮箱验证注册系统
javascript·学习·node.js·koa·注册·全栈·邮箱注册
sugar椰子皮5 天前
【爬虫框架-6】中间件的另一种写法实现
爬虫·中间件