res.write () в Azure службе приложений не работает для последовательной загрузки - PullRequest
0 голосов
/ 10 января 2020

У меня есть код файла загрузки (размер 1,2 ГБ), и мне нужно знать, как происходит загрузка. Я использую многопартийный модуль в node js для составного файла. В модуле есть определенные события, такие как «прогресс», «часть» и т. Д., С помощью которых я могу отслеживать загрузку и обработку файла. на localhost следующий код работает отлично и предоставляет console.log () и res.write () для каждого загруженного чанка, но когда я размещаю приложение в сервисе Azure Web App и вижу журналы console.log ( ) останавливается на произвольной строке и через определенное время сообщает, что запрос отменен.

Как сказано в документе в node js в [https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback] [1] : «Это отправляет кусок тела ответа. Этот метод может вызываться несколько раз для предоставления последовательных частей тела. "

Я предполагаю, что могу вызвать функцию res.write () несколько раз, что отправит буферизованную информацию клиенту (который работает так, как я хочу, на локальном хосте, но в сервисе приложения Azure) ПРИМЕЧАНИЕ. Я изменяю пределы тайм-аута запроса в процессе, чтобы он не превышал время загрузки.

form.on('progress' , function(bytesReceived, bytesExpected) {
     console.log('Upload is in progress... Processed bytes: ' + bytesReceived)  
     res.write('Processed bytes ' + bytesReceived + '\n')
     timeOutMilliSecond += 60000
     req.setTimeout(timeOutMilliSecond)
     res.setTimeout(timeOutMilliSecond)

  })
  form.on('field', (name,value) => {
     containerName = value
  })
  form.on('part' , function(dataPart) {
     if(dataPart.filename){
        try{
           blobService.createBlockBlobFromStream(containerName, dataPart.filename, dataPart, dataPart.byteCount, function(error, response){

              if(error){
                 console.log(error)
                 res.end(error)
              }
              console.log("Uploaded")
              res.end('Blob successfully uploaded')

           })
        }catch(err){
           console.log("Error occurred in processing the part " + err)
        }

     }


     dataPart.on('error' , (err) => {
        console.log('Error in data procesing ')
     })
  })
  form.on('close' ,() => {
     console.log('Form closed')

  })
  form.on('abort', () => {
     console.log('Request aborted')
  })
  form.on('error', (err) => {
     console.log('Form processing error ')
  })

  form.parse(req)

на локальном хосте это выглядит так:

Upload is in progress... Processed bytes: 16317362
Upload is in progress... Processed bytes: 16382898
Upload is in progress... Processed bytes: 16448434
Upload is in progress... Processed bytes: 16513970
Upload is in progress... Processed bytes: 16579506
Upload is in progress... Processed bytes: 16645042
Upload is in progress... Processed bytes: 16710578
Upload is in progress... Processed bytes: 16776114
Upload is in progress... Processed bytes: 16841650
Upload is in progress... Processed bytes: 16907186
Upload is in progress... Processed bytes: 16972722
Upload is in progress... Processed bytes: 16998316
Uploaded
Form closed

но на Azure это выглядит так

0|index  | Upload is in progress... Processed bytes: 1280013
0|index  | Upload is in progress... Processed bytes: 1345549
0|index  | Upload is in progress... Processed bytes: 1411085
0|index  | Upload is in progress... Processed bytes: 1476621
0|index  | Upload is in progress... Processed bytes: 1542157
0|index  | Upload is in progress... Processed bytes: 1558541
0|index  | Error in data procesing
0|index  | Error: Request aborted
0|index  |     at IncomingMessage.onReqAborted (/node_modules/multiparty/index.js:190:17)
0|index  |     at IncomingMessage.emit (events.js:198:13)
0|index  |     at abortIncoming (_http_server.js:450:9)
0|index  |     at socketOnClose (_http_server.js:443:3)
0|index  |     at Socket.emit (events.js:203:15)
0|index  |     at TCP._handle.close (net.js:607:12)
0|index  | Form processing error
0|index  | Error: Request aborted
0|index  |     at IncomingMessage.onReqAborted (/node_modules/multiparty/index.js:190:17)
0|index  |     at IncomingMessage.emit (events.js:198:13)
0|index  |     at abortIncoming (_http_server.js:450:9)
0|index  |     at socketOnClose (_http_server.js:443:3)
0|index  |     at Socket.emit (events.js:203:15)
0|index  |     at TCP._handle.close (net.js:607:12)

Но самое смешное, когда я удаляю строку res.write () и разверните это в Azure он отлично справляется с загрузкой, просто я не получаю последовательных ответов на загрузку.

...