【问题标题】:How to upload a file using Node JS function in Azure如何在 Azure 中使用 Node JS 函数上传文件
【发布时间】:2018-05-25 09:40:54
【问题描述】:

我正在尝试创建一个处理文件上传的 Azure 函数。我尝试了不同的选项(尝试直接从请求中读取或使用强大的)。

对于这两种情况,执行函数时都会出现以下错误。

Exception while executing function: Functions.UploadFile. mscorlib: TypeError: req.on is not a function  
    at IncomingForm.parse (D:\home\site\wwwroot\node_modules\formidable\lib\incoming_form.js:117:6)  
    at module.exports (D:\home\site\wwwroot\UploadFile\index.js:5:10)  
    at D:\Program Files (x86)\SiteExtensions\Functions\1.0.11702\bin\azurefunctions\functions.js:106:24.  

功能代码如下

var formidable = require("formidable");  

module.exports = function (context, request) {  
    context.log('JavaScript HTTP trigger function processed a request.');      
    var form = new formidable.IncomingForm();  
    form.parse(request, function (err, fields, files) {  
        context.res = { body : "uploaded"};  
    });  
    context.done();  
};  

感谢任何帮助。

【问题讨论】:

  • 你可以试试类似:const buffers = []; request.on('data', (data) => { buffers.push(data); }); request.on('end', () => { context.res = { body : "uploaded"}; context.done(); });
  • 感谢您的建议。我收到与此代码相同的错误消息。在 Azure 框架中,请求对象是否可能没有实现正确的接口集?
  • 您能否尝试记录request 对象,看看它是否与express.js 或其他一些框架具有相同的接口?
  • 当我执行 context.log(request) 时,我得到的只是在日志中请求 [object Object]。有没有其他方法可以找到接口?
  • 你可以JSON.stringify()它或util.inspect()它。

标签: node.js azure azure-functions serverless


【解决方案1】:

我得到它与以下工作。在 Azure 函数(以及 AWS lambda 中)中,请求对象既不是 Stream 也不是 EventEmitter。它只是填充了正文和标题。我从https://www.npmjs.com/package/parse-multipart 那里得到了帮助。我必须针对 Azure 功能对其进行调整

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);
    // get boundary for multipart data e.g. ------WebKitFormBoundaryDtbT5UpPj83kllfw
    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();  
};

这似乎更适用于 Azure Function 2.x 运行时(测试版)。我已经更新了代码。我已经用 PDF、JPG、PNG 和 XLSX 对此进行了测试。

【讨论】:

  • 如果只有一个文件,上面的代码可以工作,但如果我们有其他字段和一个文件,则失败。
【解决方案2】:

请确保您正在读取二进制数据,如此处所述 —
https://docs.microsoft.com/en-us/azure/azure-functions/functions-triggers-bindings#binding-datatype-property

对于 JavaScript 等动态类型语言,请使用 function.json 文件中的 dataType 属性。例如,要以二进制格式读取 HTTP 请求的内容,请将 dataType 设置为 binary

{
   "type": "httpTrigger",
   "name": "req",
   "direction": "in",
   "dataType": "binary"
}

dataType 的其他选项是streamstring

【讨论】:

猜你喜欢
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 2021-08-29
  • 2019-09-09
相关资源
最近更新 更多