gpt4 book ai didi

node.js - 如何使用 supertest 测试 Express 应用程序的 POST 请求参数?

转载 作者:可可西里 更新时间:2023-11-01 17:10:05 32 4
gpt4 key购买 nike

我正在使用 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') 出现了 undefinedreq.body 也是空的。

是否有一些我不知道的 req.fields 属性,或者我的测试是否存在某种缺陷?

最佳答案

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

因此,只要收到 http 请求 header 而不是请求正文,express(实际上是 node.js http 服务器)就会调用请求调用。您必须显式读取并等待正文到来并自行解析。

幸运的是,有 express 中间件模块可以为您解析正文。在这种情况下,您发送的是一个 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 解析器:

关于node.js - 如何使用 supertest 测试 Express 应用程序的 POST 请求参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23075838/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com