gpt4 book ai didi

javascript - 使用 multer 上传文件时 Node.js 连接重置

转载 作者:太空宇宙 更新时间:2023-11-04 00:45:37 28 4
gpt4 key购买 nike

我有一个 Node/express 应用程序,可以使用 multer 处理文件上传。在我的本地计算机上一切正常,但在服务器上,如果上传的文件超过几兆字节,浏览器将停止并出现“连接重置”错误。

这是上传脚本的简单测试版本:

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 目录中看到文件的一大块,但它永远不会完成,也不会抛出任何错误,无论是在 Node 还是在系统日志中。

最佳答案

@NadavL 是对的,尽管我没有前端服务器,但 Node 本身超时了。

写在 the docs默认情况下 Node 没有超时。 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 )。

关于javascript - 使用 multer 上传文件时 Node.js 连接重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34892240/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com