2014-06-25 110 views
3

我在數字海洋上使用node.js並嘗試運行文件上傳/下載服務器。Node.js錯誤「拋出std :: bad_alloc實例後終止what():std :: bad_alloc」

爲了確保服務器在後臺運行,並在錯誤不退出,我使用以下

nohup nodejs server.js &

我使用nodejs代替node命令,因爲那是什麼數字海洋建議。
這臺服務器幾乎是極其簡單的上傳和下載文件。這個工作,大約兩個文件,但隨後的服務器,出現以下錯誤崩潰:

"terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc"

我不知道是什麼原因造成這一點,我希望得到任何幫助。防止崩潰會很好,但也可以使節點服務器不會崩潰也很好。我認爲這是nohup所做的,但顯然不是。 (我也一直無法正常工作)。

這裏是我的服務器代碼:

var http = require('http'), 
    url = require('url'), 
    util = require('util'), 
    path = require('path'), 
    fs = require('fs'), 
    qs = require('querystring'); 


var formidable = require('formidable'), 
    mime = require('mime'); 
var account = {username: 'test', password: 'etc'}; 
var accounts = [account], 
    port = 9090, 




function dirTree(filename) { 
    var stats = fs.lstatSync(filename), 
     info = { 
      name: path.basename(filename), 
      path: ip + ':' + port + '/uploads/finished/' + path.basename(filename), 
      type: mime.lookup(filename).substring(0, 5) 
     }; 

    if (stats.isDirectory()) { 
     info.type = "folder"; 
     info.children = fs.readdirSync(filename).map(function(child) { 
      return dirTree(filename + '/' + child); 
     }); 
    } 
    return info; 
} 



http.createServer(function(request, response) { 

    if(request.method.toLowerCase() == 'get') { 
     var filePath = './content' + request.url; 
     if (filePath == './content/') { 
      filePath = './content/home.html'; 
     } 
     if (filePath == './content/feed') { 
      a = dirTree('./content/uploads/finished'); 
      response.end(JSON.stringify(a)); 
     } 
     var extname = path.extname(filePath); 
     var contentType = mime.lookup(extname); 
     fs.exists(filePath, function (exists) { 
      if (exists) { 
       fs.readFile(filePath, function (error, content) { 
        if (error) { 
         response.writeHead(500); 
         response.end(); 
        } 
        else { 
         response.writeHead(200, {'Content-Type': contentType}); 
         response.end(content, 'utf-8'); 
        } 
       }) 
      } else { 
       response.writeHead(404); 
       response.end(); 
      } 
     }); 
    } 


    if (request.method.toLowerCase() == 'post') { 
     var form = new formidable.IncomingForm; 
     if (request.url == '/verify') { 
      form.parse(request, function (err, fields, files) { 
       for (i = 0; i < accounts.length; i++) { 
        if (fields.username == accounts[i].username && fields.password == accounts[i].password) { 
         fs.readFile('./content/uploadForm.html', function (error, content) { 
          if (error) { 
           response.end('There was an error'); 
          } else { 
           response.end(content); 
          } 
         }); 
        } else { 
         fs.readFile('./content/invalidLogin.html', function (error, content) { 
          if (error) { 
           response.end('There was an error'); 
          } else { 
           response.end(content); 
          } 
         }); 
        } 
       } 
      }); 
     } else if (request.url == '/upload') { 
       var oldPath, 
       newPath, 
       fileName; 

      form.uploadDir = './content/uploads/temp/'; 
      form.keepExtensions = true; 
      form.parse(request, function (err, fields, files) { 
       type = files['upload']['type']; 
       fileName = files['upload']['name']; 
       oldPath = files['upload']['path']; 
       newPath = './content/uploads/finished/' + fileName; 
      }); 

      form.on('end', function() { 
       fs.rename(oldPath, newPath, function (err) { 
        if (err) { 
         response.end('There was an error with your request'); 
         console.log('error') 
        } else { 
         response.end('<h1>Thanks for uploading ' + fileName + '<h1>'); 
        } 
       }); 
      }); 
     } 
    } 
}).listen(port); 
console.log('listening on ' + port); 
+0

'nodejs -v'說什麼? – mscdex

回答

4

它看起來像你的腳本剛用完的可用內存。

您很可能上傳或下載非常大的文件,並在接收或發送時讀取內存中的完整文件。

您應該使用流操作和逐塊處理文件來改寫代碼。

相關問題