来自 url 中的 query 参数可直接通过 context.query 获取,但 POST 方式提交的表单数据则需要借助中间件的解析来完成,比如 koa-bodyparser

首先准备好一个表单页面,为了演示,其中包含一个数组类型的数据。

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>post json</title>
</head>
<body>
<form action="/save" method="POST">
<div>
<label for="name"
>name:
<input type="text" name="name" id="name" value="Tom" />
</label>
</div>
<div>
<label for="age"
>age:
<input type="number" name="age" id="age" value="19" />
</label>
</div>
<div>
<label
>hobbies:
<br />
<input
type="text"
name="hobbies[0]"
id="hobbies[0]"
value="reading"
/>
<br />
<input type="text" name="hobbies[1]" id="hobbies[1]" value="music" />
<br />
<input type="text" name="hobbies[2]" id="hobbies[2]" value="swim" />
</label>
</div>
<button type="submit">Submit</button>
</form>
</body>
</html>

server.js

var Koa = require("koa");
var Router = require("koa-router");
var fs = require("fs");
var bodyParser = require("koa-bodyparser"); var app = new Koa();

var router = new Router(); app.use(bodyParser()); router.get("/", async (ctx, next) => {

ctx.type = "html";

ctx.body = fs.createReadStream("index.html");

}); router.post("/save", async (ctx, next) => {

ctx.body = ctx.request.body;

}); app.use(router.routes()).use(router.allowedMethods());

app.listen(3000); console.log("server started at http:localhost:3000");

通过 Node.js 调试模式启动服务可查看到接收到的数据,其中数据类型解析正常。

$ node --inspect-brk server.js
server started

接收到的表单数据

但其实前台页面提交的并不是 JSON 类型,这是 koa-bodyparse 解析后的结果。通过 Chrome Devtools 的网络面板可看到,真实的类型为 Request 中 Content-Type 字段,为 application/x-www-form-urlencoded

表单提交时的请求类型为 `application/x-www-form-urlencoded`

原生的 HTML 表单 <form> 是没有 JSON 类型的,其总共有三种默认的格式,

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

默认为 application/x-www-form-urlencoded,可通过 <form> 表单的 enctype 指定。

所以真正意义上以 JSON 格式提交,需要借助 JavaScript,真实场景下表单也大多会走代码提交而非原生 submit 类型的 <button>

首页更新表单代码添加 onsubmit 方法:

- <form action="/save" method="POST">
+ <form action="/save" method="POST" onsubmit="submitForm(event)" id="myForm">

添加以下代码到页面以提交表单:

<script>
function submitForm(event) {
event.preventDefault();
var formData = new FormData(myForm);
let data = {};
for (var [key, value] of formData.entries()) {
if (key.startsWith("hobbies")) {
data["hobbies"]
? data["hobbies"].push(value)
: (data["hobbies"] = [value]);
} else {
data[key] = value;
}
}
    <span class="pl-en">fetch</span>(<span class="pl-s"><span class="pl-pds">"</span>/save<span class="pl-pds">"</span></span>, {
method<span class="pl-k">:</span> <span class="pl-s"><span class="pl-pds">"</span>POST<span class="pl-pds">"</span></span>,
headers<span class="pl-k">:</span> {
<span class="pl-s"><span class="pl-pds">"</span>Content-Type<span class="pl-pds">"</span></span><span class="pl-k">:</span> <span class="pl-s"><span class="pl-pds">"</span>application/json<span class="pl-pds">"</span></span>
},
body<span class="pl-k">:</span> <span class="pl-c1">JSON</span>.<span class="pl-c1">stringify</span>(data)
})
.<span class="pl-c1">then</span>(<span class="pl-k">function</span>(<span class="pl-smi">response</span>) {
<span class="pl-k">return</span> <span class="pl-smi">response</span>.<span class="pl-en">json</span>();
})
.<span class="pl-c1">then</span>(<span class="pl-k">function</span>(<span class="pl-smi">response</span>) {
<span class="pl-en">console</span>.<span class="pl-c1">log</span>(response);
});
}

</script>

最后完整的后台与页面代码为:

server.js
var Koa = require("koa");
var Router = require("koa-router");
var fs = require("fs");
var bodyParser = require("koa-bodyparser"); var app = new Koa();

var router = new Router(); app.use(bodyParser()); router.get("/", async (ctx, next) => {

ctx.type = "html";

ctx.body = fs.createReadStream("index.html");

}); router.post("/save", async (ctx, next) => {

ctx.body = ctx.request.body;

}); app.use(router.routes()).use(router.allowedMethods());

app.listen(3000); console.log("server started at http:localhost:3000");
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>post json</title>
</head>
<body>
<form action="/save" method="POST" onsubmit="submitForm(event)" id="myForm">
<div>
<label for="name"
>name:
<input type="text" name="name" id="name" value="Tom" />
</label>
</div>
<div>
<label for="age"
>age:
<input type="number" name="age" id="age" value="19" />
</label>
</div>
<div>
<label
>hobbies:
<br />
<input
type="text"
name="hobbies[0]"
id="hobbies[0]"
value="reading"
/>
<br />
<input type="text" name="hobbies[1]" id="hobbies[1]" value="music" />
<br />
<input type="text" name="hobbies[2]" id="hobbies[2]" value="swim" />
</label>
</div>
<button type="submit">Submit</button>
</form>
<script>
function submitForm(event) {
event.preventDefault();
var formData = new FormData(myForm);
let data = {};
for (var [key, value] of formData.entries()) {
if (key.startsWith("hobbies")) {
data["hobbies"]
? data["hobbies"].push(value)
: (data["hobbies"] = [value]);
} else {
data[key] = value;
}
} fetch("/save", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(data)
})
.then(function(response) {
return response.json();
})
.then(function(response) {
console.log(response);
});
}
</script>
</body>
</html>

再次查看提交时的 Content-Type 及所提交的数据,已经是 JSON 格式了。

通过 fetch 提交 JSON 格式的表单数据

Koa 提交和接收 JSON 表单数据的更多相关文章

  1. koa 基础(十一)koa 中 koa-bodyparser 中间件获取表单提交的数据

    1.app.js /** * koa 中 koa-bodyparser 中间件获取表单提交的数据 * 1.npm install --save koa-bodyparser * 2.引入 const ...

  2. Jquery serialize()提交多个表单数据

    ajax提交多个表单数据: 先把不同的表单分别用serialize()函数,然后把序列化后的数据用+拼接提交给后台,具体例子如下 var data1 = $('#form1).serialize(); ...

  3. json化表单数据

    /** * josn化表单数据 * @name baidu.form.json * @function * @grammar baidu.form.json(form[, replacer]) * @ ...

  4. 使用jQuery实现跨域提交表单数据

    我们在WEB开发中有时会遇到这种情况,比如要从A网站收集用户信息,提交给B网站处理,这个时候就会涉及到跨域提交数据的问题.本文将给您介绍如何使用jQuery来实现异步跨域提交表单数据.   在jQue ...

  5. SpringMVC中使用bean来接收form表单提交的参数时的注意点

    这是前辈们对于SpringMVC接收表单数据记录下来的总结经验: SpringMVC接收页面表单参数 springmvc请求参数获取的几种方法 下面是我自己在使用时发现的,前辈们没有记录的细节和注意点 ...

  6. struts2自动接收表单数据

    提交页面主要代码: <form method="post" action="messageAction">   <input type=&qu ...

  7. Servlet的5种方式实现表单提交(注册小功能),后台获取表单数据

    用servlet实现一个注册的小功能 ,后台获取数据. 注册页面: 注册页面代码 : <!DOCTYPE html> <html> <head> <meta ...

  8. easyui不提交window中的form表单数据

    <form id="ff" method="post">, <div id="win" class="easyu ...

  9. Struct2提交表单数据到Acion

    Struct2提交表单数据到Action,Action取表单的数据,传递变量.对象 HTML.jsp <form action="reg.do" method="p ...

随机推荐

  1. Logstash Multiple Pipelines

    作为生产者和消费者之间数据流的一个中心组件,需要一个 Logstash 实例负责驱动多个并行事件流的情况.默认情况下,这样的使用场景的配置让人并不太开心,使用者会遭遇所谓的条件地狱(Condition ...

  2. BOM介绍以及方法

    BOM介绍和window对象的方法 一.BOM对象 (浏览器对象模型 BOM) 1.window alert() confirm() prompt() setInterval() ​ setTimeo ...

  3. java架构之路(Sharding JDBC)mysql5.7yum安装和主从

    安装mysql5.7单机 1.获取安装yum包 [root@iZm5e7sz135n16ua2rmbk6Z local]# wget http://dev.mysql.com/get/mysql57- ...

  4. C#_.NetFramework_Web项目_EXCEL数据导出

    [推荐阅读我的最新的Core版文章,是最全的介绍:C#_.NetCore_Web项目_EXCEL数据导出] 项目需引用NPOI的NuGet包: A-2:EXCEL数据导出--Web项目--C#代码导出 ...

  5. MySql-8.0.16-winx64 安装

    参考文章: https://www.cnblogs.com/lxlin/p/9635350.html https://www.cnblogs.com/xc1234/p/9050149.html MyS ...

  6. C# Xamarin 数据绑定入门基础

    目录 关于数据绑定 视图-视图绑定 绑定模式 简单的集合绑定 C# Xamarin 数据绑定入门基础 关于数据绑定 Xamarin 单向.双向绑定 Xaml绑定 C#代码绑定 在此之前,几段 伪代码 ...

  7. C# HttpClient 请求认证、数据传输笔记

    目录 一,授权认证 二,请求类型 三,数据传输 C# HttpClient 请求认证.数据传输笔记 一,授权认证 客户端请求服务器时,需要通过授权认证许可,方能获取服务器资源,目前比较常见的认证方式有 ...

  8. 持续集成与Devops关系

    什么是持续集成 持续集成(Continuous Integration,简称CI),是一种软件开发实践,在实践中指只要代码有变更,就自动运行构建和测试,反馈运行结果.通俗一点来讲,就是绑定项目的代码仓 ...

  9. jmeter控制器(四)

    交替控制器: 交替控制器主要是让控制器里面的请求顺序执行,如下图设置了审批管理循环3次,那么第一次运行就执行了请假模块,第二次运行执行了请假模块1,第二次执行了请加模块2,依顺序每一个请加模块只执行一 ...

  10. Linux下使用 github+hexo 搭建个人博客03-hexo配置优化

    上两张文章,我们说了 hexo 部署.主题的切换.博文的创建.MarkDown 简单使用和 hexo 部署到 GitHub Pages. 也说了我们会使用 next 主题做为我们后期博客的使用和维护. ...