如何使用HTTP触发器在Azure功能应用程序中解析多部分表单数据? (的NodeJS)

时间:2016-11-21 05:42:39

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

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

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:3)

由于Azure Functions已在Node.js中包装了http服务器对象,并且公开了具有多种功能的简单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的答案来解析请求正文内容到文件内容,并使用Azure Storage SDK for node.js上传到Azure存储,您可以通过KUDU控制台安装自定义节点模块。有关详细信息,请参阅https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node#node-version--package-management

我建议你可以尝试利用node.js中的Azure API App来接近你的requiremnet。因为它是一个基于expressjs的项目,它将更容易处理上传文件。

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

答案 1 :(得分: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以实现这种可扩展性。

答案 2 :(得分:0)

要回答原始问题:

  

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

     

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

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

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

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


module.exports = function (context, request) {  
    context.log('JavaScript HTTP trigger function processed a request.'); 
    // encode body to base64 string
    var bodyBuffer = Buffer.from(request.body);

    var boundary = multipart.getBoundary(request.headers['content-type']);
    // parse the body
    var 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