【问题标题】:How to parse Multi-part form data in an Azure Function App with HTTP Trigger? (NodeJS)如何使用 HTTP 触发器解析 Azure Function App 中的多部分表单数据? (NodeJS)
【发布时间】:2022-03-09 17:55:13
【问题描述】:

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

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

但是,NodeJS 的多部分表单数据解析器都是 httpserver 或 expressJS 中间件的形式。

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

谢谢!

【问题讨论】:

    标签: node.js http azure multipartform-data azure-functions


    【解决方案1】:

    回答原始问题:

    但是,NodeJS 的多部分表单数据解析器都是以 httpserver 或 expressJS 中间件。

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

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

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

    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
    

    【讨论】:

    • 这对我来说非常适合多个文件的形式。但无法与文本字段对话。
    【解决方案2】:

    由于 Azure Functions 在 Node.js 中封装了 http 服务器对象,并公开了一个简单的 reqcontext 具有多个功能,请参阅 https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node#exporting-a-function 了解详细信息。

    而且大部分情况下,Azure Functions 是为触发器和 webhook 请求而设计的,您可以参考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的答案将请求正文内容解析为文件内容,并利用Azure Storage SDK for node.js上传到Azure Storage,您可以通过KUDU控制台安装自定义节点模块。更多信息请参考https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node#node-version--package-management

    我建议您可以尝试利用 node.js 中的Azure API App 来接近您的需求网。由于是基于expressjs的项目,上传文件处理起来会更方便。

    如有任何进一步的问题,请随时告诉我。

    【讨论】:

    • 似乎手动解析是目前唯一的解决方案,尽管对于大型文件集可能会失败。我知道 API App 解决方案,但很高兴确认多部分解析不是 Azure Function 的预期用例的一部分(目前)谢谢!
    【解决方案3】:

    您可以尝试使用此适配器进行功能和表达,它可能会让您成功使用您想要的多部分中间件: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 以实现这种可扩展性是个好主意。

    【讨论】:

    • 似乎大多数基于节点的多部分解决方案(busboy、multer(基于 busboy)、多方等)都希望 req 成为流(例如,req.pipe(busboy) )。尽管我可能忽略了一些东西,但似乎 azure 函数提供的 req 或使用 azure-function-express 包装它都没有支持这一点。我希望能够将 multer 中间件与 multer-azure 一起使用,并将文件直接上传到 azure blob 存储。
    【解决方案4】:

    我对新的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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-01
      • 2017-12-22
      • 2020-03-12
      • 2020-02-27
      • 1970-01-01
      • 2020-07-07
      • 2018-05-14
      • 2020-08-12
      相关资源
      最近更新 更多