egg的controller里面怎么获取请求的参数啊
发布于 7 年前 作者 FlyerJay 13901 次浏览 来自 问答

不管用this.ctx.body还是this.params都获取不到参数

18 回复

this.ctx.request 和 this.ctx.req里面也没有,是不是我什么地方配置有问题,

那看你是什么提交的了。如果是form表单提交的,就用ctx.request.body就取到了

@461534898 我就是用这个没取到。。。我也不知道为什么这么简单的东西我会遇到问题。。。

@461534898 好像是我的request里面没有body这个对象

@FlyerJay 你最好放个能重现的项目,一看代码就知道了~ 不然这样只靠猜,效率很低~

@FlyerJay ctx.request.body这个对象后面跟上你要取得那个字段名就OK啊

@461534898 我的这个对象是空的。。。

用this.ctx.query试试

来自酷炫的 CNodeMD

一般提问总要附上代码吧,给个截图怎么猜。。

  • ctx.body 是输出的,不是读取的,ctx.body = 'hi, egg';
  • ctx.request.body 是输入的 POST body
  • ctx.query 才是输入的查询参数 /news?page=12 -> ctx.query.page
  • ctx.param 是路由匹配的,来自于 koa-router,/users/:id -> ctx.param.id

上面这些其实都不属于 egg 的扩展了,就是 koa 的基础。建议再回去看看 koa 和 egg 的文档。 http://koajs.com/#request

@hwj128911 query是查询get参数的

@atian25 这个文档我也看过,可能是用法有点问题,已经解决了

@FlyerJay 什么问题? 解决了可以描述出来啊

@sandisen 自己开一个帖子去回复啊,不要到处影响别人

是不是form表单设置了enctype=“multipart/form-data"属性? 我也遇到这个问题,由于楼主没有上代码,不知道你实际问题是啥,我说下我遇到的问题吧! 看egg的文档的时候,看到router那里,直接提交提交post请求是报错的,因为文档有说明,安全威胁 CSRF 的防范。 然后在该章节的示例代码中,form表单是这个样子的: <form method=“POST” action=”/upload?_csrf={{ ctx.csrf | safe }}" enctype=“multipart/form-data”> title: <input name=“title” /> file: <input name=“file” type=“file” /> <button type=“submit”>upload</button> </form> 关键是enctype="multipart/form-data" enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。 默认地,表单数据会编码为 “application/x-www-form-urlencoded”。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值)。 属性取值: 1.application/x-www-form-urlencoded:在发送前编码所有字符(默认) 2.multipart/form-data :不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。 3.text/plain:空格转换为 “+” 加号,但不对特殊字符编码。 结论:示例中是文件上传,所以设置了enctype=“multipart/form-data”,不对字符编码(所以ctx.request.body获取不到值了?)。如果是普通的表单提交,不要设置enctype属性(其实有个默认值),在发送前编码所有字符!这样ctx.request.body就能获取值了。

@atian25 大大,你好,虽然我直到这个坑是属于基础知识问题,但因为文档router的章节会引导到这个crfs表单提交的的示例,总有人会踩…我建议应该在文档中标注一下设置enctype="multipart/form-data"是针对文件上传的。

@cmygit 你说的 “但因为文档router的章节会引导到这个crfs表单提交的的示例”,没看到这个文档中有这个明确的 form 表单的例子呢,不知道是不是说的这里: https://github.com/eggjs/examples/blob/master/multipart/app/view/page/form.html

回到顶部