首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试使用koa解析器和未定义的ctx.body

尝试使用koa解析器和未定义的ctx.body
EN

Stack Overflow用户
提问于 2019-04-04 04:29:50
回答 3查看 6K关注 0票数 1

我正在努力学习考拉,却弄不明白为什么我会犯这个错误:

代码语言:javascript
复制
server error TypeError: ctx.body is not a function
    at getHandler (/Users/tomcaflisch/Sites/learn-koa/server.js:32:7)

当我运行这段代码时:

代码语言:javascript
复制
'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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-09 16:30:42

这正是问题所在:ctx.body is not a function

从医生那里:

Koa响应对象是节点的普通响应对象之上的抽象

代码语言:javascript
复制
Response aliases

The following accessors and alias Response equivalents:

    ctx.body
    ctx.body=

因此,从本质上说,ctx.body是一个对象,您可以将要发送的东西作为响应分配给它。

如果您查看Hello World示例,响应只分配给Response对象,然后koa发送该对象。

代码语言:javascript
复制
app.use(async ctx => {
  ctx.body = 'Hello World';
});

因此,将代码更改为下面的代码将响应体用作json

代码语言:javascript
复制
function getHandler (ctx, next) {
  // ctx.set('Location', 'http://localhost:3000/foo')
  ctx.body = { foo: 'bar' };
}
票数 5
EN

Stack Overflow用户

发布于 2019-04-04 07:48:27

你知道吗,得到请求没有身体,只有帖子请求做什么?

票数 1
EN

Stack Overflow用户

发布于 2019-04-08 01:01:42

来自koajs/bodyparser文档

ctx.body不存在,它是ctx.request.body返回JSON对象(不是函数)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55507872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档