2017-02-28 12 views
0

私は現在Azureにファイルをダウンロードして(そのファイルへのダウンロードURLリンク経由で)base64でエンコードし、このbase64でエンコードされたファイルを要求元に送り返しています。私が実行している問題は、パフォーマンスに基づいています。以下のスクリプトは、場合によっては、実行時間が30秒を超えることによって、別のアプリケーションのタイムアウトです。これらのタイムアウトのうちの1つに該当するファイルは、サイズが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()でエラーが発生した場合、返信を送信することはなく、元のリクエストはタイムアウトします。

関連する問題