2016-01-20 96 views
1

我有一個節點/快速應用程序處理文件上傳與multer。在我的本地機器上一切正常,但在服務器上,如果上傳的文件超過幾Mbs,則瀏覽器會因「連接重置」錯誤而停止。與multer文件上傳Node.js連接重置

這裏是上傳腳本的一個簡單的測試版本:

var express = require('express'); 
var multer = require('multer'); 

// Create server 
var app = express(); 

// Start server 
function startServer() { 
    var port = 8888; 
    server = app.listen(port, function() { 
     console.log('Node version:' + process.versions.node); 
     console.log('Express server listening on port %d in %s mode', port, app.settings.env); 
    }); 
} 

var upload = multer({dest: './tmp/'}); 

var app = express() 

app.post('/', upload.single('data'), function (req, res, next) { 
    console.log(req.file); 
}); 

startServer(); 

而這裏的HTML頁面來測試上傳:

<!doctype html> 
<html> 
    <head> 
     <meta charset="utf-8"> 
     <meta http-equiv="x-ua-compatible" content="ie=edge"> 
     <title>Test Upload</title> 
     <meta name="description" content=""> 
     <meta name="viewport" content="width=device-width, initial-scale=1"> 

    </head> 
    <body> 
     <p>Hello world! This is a test upload.</p> 

     <form method="post" action="http://192.168.1.234:8888" enctype="multipart/form-data"> 
      <label>file</label><br> 
      <input type="file" name="data"><br> 

      <input type="submit" name="submit" value="Upload"> 
     </form> 


    </body> 
</html> 

我在兩個不同的服務器進行測試 - 一個VPS和裸機 - 我最終在兩臺服務器上都出現了相同的錯誤。上傳開始,我可以在我的./tmp目錄中看到該文件的一大塊,但它不會完成,並且不會在節點和系統日誌中發出任何錯誤。

+1

從我的經驗來看,它可能是apache/nginx /其他服務器運行的超時配置,我會試着研究一下。 – NadavL

+0

可能還沒有足夠的磁盤空間? –

+0

@NadavL到目前爲止節點是前端服務器,沒有什麼代理服務器...... – Buzut

回答

0

@NadavL是正確的,儘管我沒有前端服務器,節點本身超時。

它寫在the docs默認情況下沒有節點超時。 Express可能會重寫,但我無法找到關於此事的任何信息。

要全局定義特定的超時,你可以通過改變套接字超時當服務器連接

[…] 

// Start server 
function startServer() { 
    var port = 8888; 
    server = app.listen(port, function() { 
     console.log('Node version:' + process.versions.node); 
     console.log('Express server listening on port %d in %s mode', port, app.settings.env); 
    }); 

    server.on('connection', function(socket) { 
     // 10 minutes timeout 
     socket.setTimeout(10 * 60 * 1000); 
    }); 
} 

但作爲一個高超時升起你的服務器遭受Slow HTTP Attacks,您可能要更改默認的超時時間進行只是爲了一個特定的路線 - 就我而言,只是爲了上傳路線。在這種特殊情況下,你所要做的就是改變超時在你的路由的處理,像這樣:

app.post('/myroute', function (req, res) { 
    // 10 minutes timeout just for POST to myroute 
    req.socket.setTimeout(10 * 60 * 1000); 
    upload.single('data'); 
    console.log(req.file); 
}); 

還有一個專門的中間件處理超時,這就是所謂的connect-timeout,它可以用於配置特定超時了不同的路線(見this post on SO)。