2016-01-20 79 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)。