koa2使用koa-bodyparser和简单的GET

时间:2018-02-16 01:31:48

标签: javascript node.js koa

我试图了解如何使用简单GET配置koa-bodyparser。如果我包含解析器,则以下内容返回完全相同的主体:

const Koa = require('koa');
const Router = require('koa-router');
const bodyParser = require('koa-bodyparser');

const app = new Koa();
const router = new Router();

app.use(bodyParser());

var users = [{
  id: 1,
  firstName: 'John',
  lastName: 'Doe'
}, {
  id: 2,
  firstName: 'Jane',
  lastName: 'Doe'
}];

router
    .get('/api', async (ctx, next) => {
    console.log('Getting users from /api');
    ctx.body = ctx.request.body = users;
});

app.use(router.routes());

app.listen(3000, () => console.log('Koa app listening on 3000'));

documentation说:

// the parsed body will store in ctx.request.body
// if nothing was parsed, body will be an empty object {}
ctx.body = ctx.request.body;

我不确定我是否正确解析:

ctx.body = ctx.request.body = users;

1 个答案:

答案 0 :(得分:2)

koa-bodyparser解析请求正文,而不解析响应正文。在GET请求中,您通常不会收到包含请求的正文。要将JSON正文返回给调用者,您需要做的就是

router
  .get('/api', async ctx => {
    console.log('Getting users from /api');
    ctx.body = users;
  });

如果你想看到正在进行的解析,你需要一个PUT,POST,PATCH等。

router
  .post('/api', async ctx => {
    console.log('creating user for /api');
    const user = ctx.request.body;
    // creation logic goes here
    // raw input can be accessed from ctx.request.rawBody
    ctx.status = 201;
  });

您需要在Postman或curl这样的帖子请求中传递有效的JSON:

curl -X POST \
  http://localhost:3000/api \
  -H 'Content-Type: application/json' \
  -d '{
    "firstName": "Zaphod",
    "lastName": "Beeblebrox"
  }'

您会发现ctx.request.body具有JSON值,而ctx.request.rawBody的字符串值为'{"firstName":"Zaphod","lastName":"Beeblebrox"}'。这会给你带来什么?在这种情况下,它使您无需调用JSON.parse(ctx.request.body)来获取有效的JSON。 koa-bodyparser不仅如此,因为它在文档中的统计信息,它根据随请求传递的Content-Type标头处理JSON,Form和Text主体。