2017-02-28 77 views
0

我目前有一個坐在Azure上的node.js腳本,它通過下載URL鏈接獲取文件並通過base64對其進行編碼,然後將此base64編碼文件發送回請求源。我遇到的問題是基於性能的。下面的腳本在某些情況下通過運行時間超過30秒來超時一個單獨的應用程序。其中一個超時問題的文件大小小於MB。有任何想法嗎?Node.js應用程序性能

腳本:

const express = require('express'); 
const bodyParser = require('body-parser'); 


const https = require('https'); 
const fs  = require('fs'); 
const request = require('request'); 
const util = require('util'); 
const port = process.env.PORT || 3000; 

var app  = express(); 


app.use(bodyParser.json()); 



app.post('/base64file', (req, res) => { 


    var fileURL = req.body.fileURL; 
    var listenerToken = req.body.listenerToken; 

    var testingData = { 
     fileURL: fileURL, 
     listenerToken: listenerToken 
    }; 



    /* 
     Make sure correct token is used to access endpoint.. 
    */ 
    if(listenerToken !== <removedforprivacy>) { 
     res.status(401); 
     res.setHeader('Content-Type', 'application/json'); 
     res.send(JSON.stringify({ error: 'You are not authorized'})); 
    } else if (!fileURL){ 
     res.status(400); 
     res.setHeader('Content-Type', 'application/json'); 
     res.send(JSON.stringify({ error: 'The request could not be understood by the server due to malformed syntax.'})); 
    } else { 

     https.get(fileURL, function(response) { 
      var data = []; 


      response.on('data', function(chunk) { 
       data.push(chunk); 
      }).on('end', function() { 
       //build the base64 endoded file 
       var buffer = Buffer.concat(data).toString('base64'); 
       //data to return 
       var returnData = { 
        base64File: buffer 
       }; 

       if(buffer.length > 0) { 
        res.setHeader('Content-Type', 'application/json'); 
        res.status(200); 
        res.send(JSON.stringify(returnData)); 
       } else { 
        res.setHeader('Content-Type', 'application/json'); 
        res.status(404); 
        res.send(JSON.stringify({ error: 'File URL not found.'})); 
       } 
      }); 
     }); 

    } 
}); 


app.listen(port, () => { 
    console.log('Server is up and running ' + port); 
}); 
+0

一個想法:你錯過了錯誤處理。如果你在'https.get()'上得到一個錯誤,你將永遠不會發送一個響應,並且原始請求會超時。 – jfriend00

+0

@ jfriend00我會檢查你的建議作爲解決方案 - 這就是它。隨意張貼下面,我會添加它作爲答案 – RH8765

回答

0

一個想法:你缺少的錯誤處理。

如果您在https.get()上遇到錯誤,您將永遠不會發送回復,並且原始請求會超時。