Как загрузить файл с помощью функции Node JS в Azure - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь создать функцию 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();  
};  

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Я получил его для работы со следующими.Объект запроса не является ни Stream, ни EventEmitter в функциях Azure (и в AWS лямбда тоже).У него просто тело и заголовки.Я получил помощь от 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.

0 голосов
/ 26 мая 2018

Просто убедитесь, что вы читаете двоичные данные, как упоминалось здесь -
https://docs.microsoft.com/en-us/azure/azure-functions/functions-triggers-bindings#binding-datatype-property

Для языков с динамической типизацией, таких как JavaScript, используйте свойство dataType в function.json file.Например, чтобы прочитать содержимое HTTP-запроса в двоичном формате, установите dataType на binary:

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

Другими параметрами для dataType являются stream и string.

...