Koa.js bohužel sama o sobě neobsahuje parser body, což jsem zjistil až dle díky kolegy, který mě upozornil, že mi to v Postmanu funguje pouze díky mé chybě. Tedy musí vybrat body parser pro Koa.
koa-bodyparser
GitHub 1100 hvězd. Poslední změna 4 měsíce. Parsuje JSON, form a text.
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;
});
koa-body
GitHub 731 hvězd. Poslední změna tento měsíc. Umí toho parsovat opravdu hodně:
- multipart/form-data
- application/x-www-urlencoded
- application/json
- application/json-patch+json
- application/vnd.api+json
- application/csp-report
- text/xml
// použití s koa-router
const Koa = require('koa');
const app = new Koa();
const router = require('koa-router')();
const koaBody = require('koa-body');
router.post('/users', koaBody(),
(ctx) => {
console.log(ctx.request.body);
// => POST body
ctx.body = JSON.stringify(ctx.request.body);
}
);
app.use(router.routes());
app.listen(3000);
console.log('curl -i http://localhost:3000/users -d "name=test"');
koa-better-body
GitHub 443 hvězd. Poslední změna tento měsíc. Parsuje text, buffer, json, json patch, json api, csp-report, multipart, form and urlencoded body.
// použití koa-router
'use strict';
var app = require('koa')();
var body = require('koa-better-body');
var router = require('koa-router')();
router.post('/upload', body(), function* (next) {
console.log(this.request.files);
console.log(this.request.fields);
// there's no `.body` when `multipart`,
// `urlencoded` or `json` request
console.log(this.request.body);
// print it to the API requester
this.body = JSON.stringify(
{
fields: this.request.fields,
files: this.request.files,
body: this.request.body || null,
},
null,
2,
);
yield next;
});
app.use(router.routes());
app.listen(4292);
var format = require('util').format;
var host = 'http://localhost:4292';
var cmd = 'curl -i %s/upload -F "source=@%s/.editorconfig"';
console.log('Try it out with below CURL for `koa-better-body` repository.');
console.log(format(cmd, host, __dirname));
koa-json-body
GitHub 14 hvězd. Poslední změna více jak tři roky. Umí jen JSON parsovat body dotazu, což je přesně co potřebuji a stačí mi.
// použití s koa-router
const body = require('koa-json-body')({ limit: '10kb' })
app.post('/users', body, (ctx, next) => {
console.log(ctx.request.body)
})
Závěr
Nakonec jsem se rozhodl zkusit používat koa-bodyparser. JSON funguje dobře a vše se jeví OK. Snad všechny výše uvedené parsery jsou založeny na šestnáct měsíců starém co-body, které by asi stačilo, jen vývoj byl zastaven.