当前位置: 首页 > news >正文

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

准备工作

安装依赖

npm init -y
npm i koa

在这里插入图片描述

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

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

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 否则没有等待效果

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

const Koa = require("koa");const app = new Koa();app.use((ctx, next) => {// 路径是 /login get 方式// ctx 包含了 request response req resconsole.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

nodemon server.js

在这里插入图片描述

输入账号密码,点击提交

在这里插入图片描述

koa-bodyparser

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

npm i koa-bodyparser

用法:

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;
});

业务里添加逻辑

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 resconsole.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

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(); // 完成后需要继续向下执行};
};

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

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

启动服务,效果一样:

在这里插入图片描述

http://www.lryc.cn/news/163646.html

相关文章:

  • 计算一串输出数字的累加和
  • python包导入原理解析
  • MNIST手写数字辨识-cnn网路 (机器学习中的hello world,加油)
  • 论文笔记《3D Gaussian Splatting for Real-Time Radiance Field Rendering》
  • 数据库管理系统,数据库,sql的基本介绍以及它们之间的关系
  • 【Flowable】Springboot使用Flowable(一)
  • 戳泡泡小游戏
  • Redis缓存
  • mysql 插入更新数据
  • 系统架构设计高级技能 · 软件产品线
  • C语言学习系列-->字符函数和字符串函数
  • 尖端AR技术如何在美国革新外科手术实践?
  • 【木板】Python实现-附ChatGPT解析
  • 第一章:绪论
  • C++面试知识点总结
  • 从智能手机到智能机器人:小米品牌的高端化之路
  • 深度学习推荐系统(八)AFM模型及其在Criteo数据集上的应用
  • 【Spring】aop的底层原理
  • 微信小程序开发---基本组件的使用
  • SpringBoot国际化配置组件支持本地配置和数据库配置
  • Shell编程之sort
  • windows docker 容器启动报错:Ports are not available
  • 300. 最长递增子序列
  • DNS(域名解析系统)
  • 解决jsp/html界面跳转servlet出现404错误的方法
  • catface,使用Interface定义Controller,实现基于Http协议的RPC调用
  • Linux:LVS (NAT群集搭建)
  • 音乐格式转换mp3怎么转?跟着步骤操作一遍
  • it监控系统可以电脑吗?有什么效果
  • jvs-智能bi(自助式数据分析)9.1更新内容