Search code examples
javascriptnode.jskoa

Trying to use koa bodyparser and ctx.body undefined


I'm trying to learn koa and can't figure out why i'm getting the error:

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

when I run this code:

'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

Solution

  • It's exactly what the issue says it is: ctx.body is not a function

    From the docs:

    A Koa Response object is an abstraction on top of node's vanilla response object

    Response aliases
    
    The following accessors and alias Response equivalents:
    
        ctx.body
        ctx.body=
    

    So essentially ctx.body is an object to which you assign something to be sent as response.

    If you look at the Hello World example, the response is just assigned to the Response object which then koa sends.

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

    So, changing your code to following serves the response body as json

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