Попытка использовать koa bodyparser и ctx.body undefined - PullRequest
1 голос
/ 04 апреля 2019

Я пытаюсь выучить koa и не могу понять, почему я получаю ошибку:

server error TypeError: ctx.body is not a function
    at getHandler (/Users/tomcaflisch/Sites/learn-koa/server.js:32:7)

, когда я запускаю этот код:

'use strict'

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

function server (app) {
  const router = new Router()
  router.get('/foo', getHandler)
  app.use(bodyParser())
  app.use(router.routes())


  app.use(async (ctx, next) => {
    try {
      await next();
    } catch (err) {
      ctx.status = err.status || 500;
      ctx.body = err.message;
      ctx.app.emit('error', err, ctx);
    }
  });

  app.on('error', (err, ctx) => {
    console.log('server error', err, ctx)
  });

  app.listen(4000)
}

function getHandler (ctx, next) {
  // ctx.set('Location', 'http://localhost:3000/foo')
  ctx.body({ foo: 'bar' })
}

module.exports = server

Ответы [ 3 ]

3 голосов
/ 09 апреля 2019

Это именно то, о чем говорит проблема: ctx.body is not a function

Из документов:

Объект отклика Koa - это абстракция поверх ванильного объекта отклика узла

Response aliases

The following accessors and alias Response equivalents:

    ctx.body
    ctx.body=

То есть, по сути, ctx.body - это объект, которому вы назначаете что-либо для отправки в качестве ответа.

Если вы посмотрите на пример Hello World, ответ просто присваивается объекту Response, который затем отправляет koa.

app.use(async ctx => {
  ctx.body = 'Hello World';
});

Таким образом, если изменить код на следующий, тело ответа будет json

function getHandler (ctx, next) {
  // ctx.set('Location', 'http://localhost:3000/foo')
  ctx.body = { foo: 'bar' };
}
0 голосов
/ 08 апреля 2019

С koajs/bodyparser документы

ctx.body не существует, и ctx.request.body возвращает объект JSON (не функцию)

0 голосов
/ 04 апреля 2019

Вам известно, что запрос GET не имеет тела, только запрос POST?

...