我正在使用Express 4.0.0创建API,其中一条路由需要POST。目前,我只是想让它回应请求参数中发送的名称。响应是一个JSON对象,但请求需要表单字段。
users.post '/user', (req, res) ->
res.json name: req.params.name
我的测试将type()
设置为form
,这应允许send()
将哈希值作为POST参数/字段传递。
describe 'POST /user', ->
it 'should echo the name sent', (done) ->
request app
.post '/user'
.type 'form'
.send name: 'Foo'
.expect '{"name":"Foo"}'
.end done
无论如何,我的测试失败,在快递中,我的req.params
为空,req.param('name')
出现undefined
,req.body
也为空。
是否有某些req.fields
属性我不知道,或者我的测试存在缺陷?
答案 0 :(得分:2)
tl; dr:您需要解析正文以获得该功能,您可以执行app.use(require('body-parser')())
,然后使用name: req.param('name')
更改代码。
因此,只要收到http请求标头而不是请求正文,express(实际上是node.js http服务器)就会调用请求调用。你必须明确地阅读并等待身体来自己解析它。
幸运的是,有快速的中间件模块可以为您解析正文。在这种情况下,您将发送urlencoded / form正文,因此您需要解析它。根据他们的例子使用任何这些模块:
假设您使用body-parser
,那么如果您希望它解析所有路线的正文,那么只需app.use(require('body-parser')()
。如果您希望它解析特定路线的正文,请执行以下操作:
bodyParser = require('body-parser')()
app.post '/user', bodyParser, (req, res) ->
res.json name: req.param('name')
一旦你正确解析了身体,你就可以通过req.body
(例如req.body.name
)属性或req.param
函数(例如req.param('name')
)来访问它。后者还将搜索查询字符串和url参数。
请注意,如果您想要解析带有附加文件的主体(用于上传文件),您需要一个多部分解析器,而不仅仅是一个urlencoded的解析器: