【问题标题】:parsing 'multipart-data' using express使用 express 解析“多部分数据”
【发布时间】:2026-02-12 15:40:01
【问题描述】:

我在解析来自客户端的数据时遇到了这个奇怪的问题。

我发现所有的 'boolean true' 都被转换为 'string true 并且对于 'undefined' 是一样的,因此我不能在这些字段上做一个 'if'。

这是我所拥有的:

var bodyParser = require('body-parser');
var app = express();
app.post('/someroute',function(req,res,next){
   console.log(typeof req.someBooleanValue);
});

我总是得到“字符串”,我期待控制台中的布尔值,因为那是客户端发送的。

现在如果内容类型设置为'application/json'就可以正常工作了

我了解正文解析器不适用于“多部分”内容类型。但那我有什么选择呢?我尝试了多方和多方。但是使用它们进行解析后,我仍然将字段作为字符串。

除了编写一个检查内容类型的小实用程序,然后使用 JSON.parse('fields') 或类似的东西做一些丑陋的引号剥离之外,没有其他方法可以处理这个问题吗?

【问题讨论】:

    标签: javascript json express multipartform-data body-parser


    【解决方案1】:

    我正在使用 Busboy 用于带有 express.js 的 REST 应用程序,以处理文件上传,在 multipart/form-data 中,它工作正常。

    项目页面上提供了示例。 只是一个警告,如果您需要处理文件上传,请确保您有一个可用于保存文件的 WriteableStream 的 'finish' 事件的侦听器,并且您不完全依赖于 busboy 本身引发的 'finish' 事件。

    【讨论】:

    • 不。这行不通。它仍然是“字符串”而不是布尔值
    【解决方案2】:

    它(某种程度上)取决于客户。

    AFAIK,multipart/form-data 通过 <form> 元素(通过浏览器)上传的部分未输入:它们包含文本(字符串)内容(用于“常规”字段)或二进制内容(用于“文件”字段) .

    换句话说,您的服务器端解析器将为您提供的所有字段都将是字符串。如果没有一些明确的代码,multer/multiparty/etc 不知道true 的字符串值是一个布尔值,所以你必须自己执行一些转换/转换,基于每个人的知识字段应包含。

    如果您使用的是 cURL 等 CLI 客户端,则可以将 JSON“文件”作为单独的部分上传(解释为 here)。您仍然需要对传入数据调用 JSON.parse(),因为它仍将作为字符串传递。

    【讨论】:

    • 那么一般是怎么处理的呢?我尝试在 req.body 上做 JSON.parse 但它失败了,因为 req.body 已经是一个 JSON 对象
    • @beNerd 您需要文件上传功能吗?如果是这样,您将被multipart/formdata 困住。如果没有,您可以使用body-parser 直接作为 JSON 上传(req.body 将是 已解析的 对象)
    • 我也需要上传文件,但在我的表单中它是可选的。我使用 body-parser,但我遇到了 true/false/undefined 值的问题。所有这些都转换为字符串,我无法在服务器端进行任何比较。
    • @beNerd 如果您要上传正确的 JSON,body-parser 应该为您提供正确的类型。这意味着您也需要将数据上传为application/json,而不是 URL 编码(因为这会将所有内容都转换为字符串)。