我正在使用Node.js + Express构建一个Web应用程序,我发现express公开的connect BodyParser在大多数情况下都非常有用。但是,我希望能够更细粒度地访问多部分表单数据POSTS--我需要将输入流通过管道传输到另一个服务器,并且希望避免首先下载整个文件。
因为我使用的是Express BodyParser,所以所有文件上传都是自动解析的,并在它们到达我的任何函数之前使用“request.files”上传和可用。
有没有一种方法可以让我禁用多部分表单数据帖子的BodyParser,而不禁用其他所有内容?
7条答案
按热度按时间dwbf0jvd1#
如果你需要使用
express.bodyParser
提供的功能,但你想禁用它的multipart/form-data,技巧是不要使用express.bodyParser directly
。express.bodyParser
是一个方便的方法,它封装了三个其他方法:express.json
、express.urlencoded
和express.multipart
。所以与其说
你只需要说
这为您提供了bodyparser对大多数数据的所有好处,同时允许您独立处理表单数据上传。
编辑:
json
和urlencoded
现在不再与Express捆绑。它们由单独的body-parser模块提供,现在您可以按如下方式使用它们:wwwo4jvm2#
如果对body解析的需求仅取决于路由本身,最简单的方法是只在需要它的路由上使用
bodyParser
作为路由中间件函数,而不是在应用程序范围内使用它:y53ybaqx3#
当您键入
app.use(express.bodyParser())
时,几乎每个请求都会经过bodyParser
函数(将执行哪一个取决于Content-Type
头)。默认情况下,支持3个标头(AFAIR)。你可以看到的来源是肯定的。你可以用类似这样的东西为
Content-Type
s(重新)定义处理程序:upd.
Express 3中的情况发生了变化,所以我分享了工作项目中的更新代码(应该是
app.use
ed beforeexpress.bodyParser()
):和一些伪代码,关于原问题:
ioekq8ef4#
在Express 3中,您可以将参数作为
{defer: true}
传递给bodyParser
-这实际上推迟了多部分处理,并将Formidable表单对象作为req. form公开。这意味着你的代码可以是:有关更详细的强大事件处理,请参阅https://github.com/felixge/node-formidable
vlf7wbxs5#
我在3.1.1中遇到过类似的问题,并找到了(不太漂亮的IMO)解决方案:
要禁用multipart/form-data的bodyParser:
以及用于解析内容:
例如,我正在使用node-multiparty,其中自定义代码应该如下所示:
ajsxfq5m6#
使用express v4和body-parser v1.17及更高版本,
您可以在bodyParser.json的
type
中传递函数。body-parser将只解析这个函数返回真实值的那些输入。
在上面的代码中,
如果
content-type
是multipart/form-data
,则该函数返回一个falsy值。因此,当
content-type
是multipart/form-data
时,它不会解析数据。wxclj1h57#
throw this is before app.configure