如何使用supertesttestingPOST请求参数Express应用程序?

我使用Express 4.0.0创build一个API,其中一个路由需要一个POST。 目前我只是试图让它响应在请求参数中发送的名称。 响应是一个JSON对象,但请求需要表单域。

users.post '/user', (req, res) -> res.json name: req.params.name 

我的testing设置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 

无论如何,我的testing失败了,在Express中,我的req.params是空的, req.param('name')undefinedreq.body也是空的。

有没有一些req.fields属性我不知道,或者是我的testing瑕疵?

tl; dr:你需要parsingbody来获取它,你可以做app.use(require('body-parser')()) ,然后用name: req.param('name')改变你的代码。

所以,expression(实际上node.js http服务器)会在收到http请求头时调用请求调用,而不是请求的主体。 你必须明确地阅读和等待身体来parsing它自己。

幸运的是,有快递中间件模块为您parsing身体。 在这种情况下,你正在发送一个urlencoded /表单体,所以你需要parsing它。 根据他们的例子使用这些模块中的任何一个:

  • 身体parsing器
  • 身体

假设你使用body-parser ,那么如果你想要为所有的路由parsing主体,那么只需要app.use(require('body-parser')() 。如果你想要parsing一个特定的路由的主体做这个:

 bodyParser = require('body-parser')() app.post '/user', bodyParser, (req, res) -> res.json name: req.param('name') 

一旦你得到正确的身体parsing,那么你可以通过req.body (例如req.body.name )属性或req.param函数(例如req.param('name') )来访问它。 后者还将search查询string和url参数。

请注意,如果您想要parsing带附件的文件(用于上传文件),则需要使用多部分parsing器,而不仅仅是urlencoded:

  • 连接多党
  • 连接-打杂