1

我正在使用 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

无论如何,我的测试失败了,在 Express 中,我req.params是空的,req.param('name')出现undefined并且req.body也是空的。

是否有一些req.fields我不知道的属性,或者我的测试有什么缺陷?

4

1 回答 1

2

tl; dr:您需要解析正文才能得到它,您可以这样做app.use(require('body-parser')()),然后使用name: req.param('name').

因此 express(实际上是 node.js http 服务器)将在收到 http 请求标头而不是请求正文时调用请求调用。您必须明确阅读并等待正文出现并自己解析。

幸运的是,有快速中间件模块可以为您解析正文。在这种情况下,您发送的是 urlencoded/form body,因此您需要对其进行解析。根据示例使用这些模块中的任何一个:

假设您使用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 解析器:

于 2014-04-16T17:59:56.290 回答