如何使用 HTTP 触发器解析 Azure Function App 中的多部分表单数据? (节点)

How to parse Multi-part form data in an Azure Function App with HTTP Trigger? (NodeJS)

我想使用 Azure Functions 编写一个 NodeJS HTTP 端点。

此端点将是一个 POST 端点,它获取文件并将这些文件上传到 blob 存储。

但是NodeJS multipart form数据解析器都是httpserver或者expressJS中间件的形式

是否有任何可用的工具可以在从函数应用程序的包装器接收到所有数据后解析多部分表单数据?

谢谢!

由于 Azure Functions 已将 http 服务器对象包装在 Node.js 中,并公开了具有多种功能的简单 reqcontext,详情请参阅 https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node#exporting-a-function

而且Azure Functions主要是为触发器和webhooks请求而设计的,您可以参考https://docs.microsoft.com/en-us/azure/azure-functions/functions-compare-logic-apps-ms-flow-webjobs进行详细比较。

同时,您可以尝试 Image upload to server in node.js without using express to parse the request body content to file content, and upload to Azure Storage leveraging Azure Storage SDK for node.js, you can install custom node modules via KUDU console. Refer to https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node#node-version--package-management 的答案以获取更多信息。

而且我建议您可以尝试利用 node.js 中的 Azure API App 来满足您的需求。由于是基于expressjs的项目,上传文件会更容易处理。

如有任何疑问,请随时告诉我。

你可以尝试使用这个adapter for functions and express,它可能会让你成功使用你想要的multi-part middleware:https://github.com/yvele/azure-function-express

作为一个不太理想的选择,您可以自己解析正文,所有多部分数据都将在 req.body 中可用,并且看起来像这样:

------WebKitFormBoundarymQMaH4AksAbC8HRW
Content-Disposition: form-data; name="key"

value
------WebKitFormBoundarymQMaH4AksAbC8HRW
Content-Disposition: form-data; name=""


------WebKitFormBoundarymQMaH4AksAbC8HRW--

我确实认为更好地支持 httpserver / express 以实现这种可扩展性是个好主意。

回答原问题:

However, NodeJS multipart form data parsers are all in the form of httpserver or expressJS middleware.

Is there any available tools that can parse the multipart form data after it has all been received from the Function Application's wrapper?

即使在您提出这个问题 2 年后,多部分表单数据解析器的状态也不是很好,就像您注意到的那样,它们中的大多数假设 req 对象是一个流,并且 tutorials/demos 展示了如何用 express 或 httpServer 解析 multipart/form-data。

但是有一个 parse-multipart npm 包可以处理来自 azure 函数的 req.body 和 return 你的对象数组,其代码类似于以下内容:

const multipart = require("parse-multipart");
 

module.exports = function (context, request) {  
    context.log('JavaScript HTTP trigger function processed a request.'); 
    // encode body to base64 string
    const bodyBuffer = Buffer.from(request.body);
     
    const boundary = multipart.getBoundary(request.headers['content-type']);
    // parse the body
    const parts = multipart.Parse(bodyBuffer, boundary);
    context.res = { body : { name : parts[0].filename, type: parts[0].type, data: parts[0].data.length}}; 
    context.done();  
}; 

(原文出处:https://www.builtwithcloud.com/multipart-form-data-processing-via-httptrigger-using-nodejs-azure-functions/

我注意到 parse-multipart 难以解决的一个领域是解析带有文本字段的表单。稍微改进的版本可以更好地处理它,称为 multipart-formdata:

require('multipart-formdata').parse(req.body, boundary)
//returns [{field, name, data, filename, type}, ...] where data is buffer you can use to save files

我对新的 azure-function-multipart 包有很好的体验。示例代码可能如下所示:

const {
  default: parseMultipartFormData,
} = require("@anzp/azure-function-multipart");

module.exports = async function (context, req) {
  const { fields, files } = await parseMultipartFormData(req);
  console.log("fields", fields)
  console.log("files", files)
};

有关详细信息,请参阅 docs