首页 > 解决方案 > 如何在 express js 中解析多部分/混合请求正文?

问题描述

如何解析内容类型的请求正文:multipart/mixed in express?

此类请求的一个简单示例如下:

curl -H "Content-Type: multipart/mixed" -F "request=@body.json;type=application/json" -F "file1=@test.xml" -X POST https://mysimpleapi.com

Body.json 文件是一个简单的 json

[{
    "name": "Test",
    "age": "23"
},
{
    "name": "Best", 
    "age": "24"
}]

并且 test.xml 只是一个常规文件。

上面的 curl 请求如下所示:

{
  "method": "POST",
  "path": "/",
  "query": {},
  "headers": {
    "x-forwarded-for": "163.47.149.248",
    "x-forwarded-proto": "https",
    "x-forwarded-port": "443",
    "host": "mysimpleapi.com",
    "x-amzn-trace-id": "Root=1-618e4f8e-2cc109560ddfb65a7b5822ef",
    "content-length": "428",
    "user-agent": "curl/7.68.0",
    "accept": "*/*",
    "content-type": "multipart/mixed; boundary=------------------------e2d73e2082b30c29"
  },
  "bodyRaw": "--------------------------e2d73e2082b30c29\r\nContent-Disposition: attachment; name=\"request\"; filename=\"body.json\"\r\nContent-Type: application/json\r\n\r\n[{\n    \"name\": \"Test\",\n    \"age\": \"23\"\n},\n{\n    \"name\": \"Best\", \n    \"age\": \"24\"\n}]\n\r\n--------------------------e2d73e2082b30c29\r\nContent-Disposition: attachment; name=\"file1\"; filename=\"test.xml\"\r\nContent-Type: application/xml\r\n\r\n\r\n--------------------------e2d73e2082b30c29--\r\n",
  "body": "--------------------------e2d73e2082b30c29\r\nContent-Disposition: attachment; name=\"request\"; filename=\"body.json\"\r\nContent-Type: application/json\r\n\r\n[{\n    \"name\": \"Test\",\n    \"age\": \"23\"\n},\n{\n    \"name\": \"Best\", \n    \"age\": \"24\"\n}]\n\r\n--------------------------e2d73e2082b30c29\r\nContent-Disposition: attachment; name=\"file1\"; filename=\"test.xml\"\r\nContent-Type: application/xml\r\n\r\n\r\n--------------------------e2d73e2082b30c29--\r\n"
}

我想获取此请求正文中的 json 对象。

我找不到任何有关如何解析此类请求的文档。我知道如何从请求中解析 JSON 和 urlencoded 表单数据,但是如何在 express 上解析这样的请求?是否有任何包可以为我进行此解析,以便 request.body 不是空对象?或者我必须自己编写某种解析器(我该怎么做?)?

标签: javascriptnode.jsexpressparsing

解决方案


我自己回答这个问题:node js 的 dicer 可以用来做这个。dicer 的 npm 上的入门示例对于上面的示例工作得很好。 https://www.npmjs.com/package/dicer


推荐阅读