当由于超时而没有来自服务器的响应时,我偶尔会遇到POST请求的重试.所有现代浏览器都具有幂等请求的重试逻辑(GET,HEAD等),但我无法推断为什么它会发生POST请求.
我正在使用一个带有3个路由和chrome浏览器的简单node.js服务器来测试这种情况.
/ : gives a html page with jquery and code snippets to fire ajax requests
/hi : gives a text response 'hello'
/sleep : request will timeout without any response
Run Code Online (Sandbox Code Playgroud)
默认情况下,node.js http服务器在2分钟后超时请求.
var http = require('http');
var server = http.createServer();
server.on('request', function(req, res) {
console.log(new Date() + ' ' + req.method + ' request on ' + req.url);
if (req.url === '/sleep') {
console.log('!!! sleeping');
} else if (req.url === '/') {
html = "$.post('/hi', {'for':'server'}, function() …Run Code Online (Sandbox Code Playgroud) 我已经在这个问题上工作了两天了,我被卡住了.我正在使用带有Express的Node.js,我正在尝试实现上传表单.基本上,我希望表单执行以下操作:
检查文件的大小,如果文件过大则取消上传(当我说取消时,我的意思是阻止任何进一步的数据写入磁盘并删除临时文件)
检查文件类型并确认它是正确的类型(.jpg,.png等),如果不是,则停止进一步写入磁盘并删除临时文件.
目前,我有上传工作,当文件太大或与正确类型不匹配时我发出错误,然后fs.unlink()在整个文件写入磁盘后删除文件.但是我发现这种方法存在一个潜在的问题:如果用户上传了一个巨大的文件(GB的大小)怎么办?凭借我的方法,它最终将从我的机器中删除,但不会浪费大量资源.基本上,我希望使用最少量的资源来确认文件可以上传.这是我到目前为止的代码:
var path = absolutePath + '/public/images/users/' + req.session.userId + '/';
var maxSize = 3146000; // 3MB
var form = new formidable.IncomingForm();
form.uploadDir = path;
form.keepExtensions = true;
form.on('error', function(message) {
if(message)
{
res.json({err: message});
}
else
{
res.json({err: 'Upload error, please try again'});
}
});
form.on('fileBegin', function(name, file){
if(form.bytesExpected > maxSize)
{
this.emit('error', 'Size must not be over 3MB');
}
});
form.on('file', function(name, file) {
var type = file.type;
type = type.split('/');
type = …Run Code Online (Sandbox Code Playgroud) 我正在使用 XMLHttpRequest(级别 2)将文件上传到 node.js 服务器。我正在检查文件流中服务器端的有效标头。现在,如果流式传输时出现任何错误,我想触发取消上传。我的 XMLHttpRequest 代码非常简单:
var xhr = new XMLHttpRequest();
var file;
$('#file').on('change', function(e) {
file = this.files[0];
file.filename = this.files[0].name;
});
$('#submit').on('click', function(e) {
e.preventDefault();
xhr.open('POST', '/upload', true);
xhr.send(file);
});
Run Code Online (Sandbox Code Playgroud)
在服务器端,我将 req 流通过验证器传输到文件流中。如果验证时发生任何错误,我希望 XMLHttpRequest 中止上传。但是仅仅发送 400 作为对请求的响应根本不起作用。我向 xhr 注册了各种监听器,但没有一个触发。它似乎根本不关心 400,仍然尝试上传文件。通常我预计 onreadystatechange 事件会在这种情况下触发。
我尝试通过发出 req.end() 来关闭 req,但这似乎有点苛刻并揭示了另一种好奇心。如果我这样做,XMLHttpRequest 会重试发送 POST 请求 7 次(在 Chrome 中;在 Firefox 中重试 5 次;这在任何地方都有记录吗?)。
编辑:正如保罗建议的那样:
...连接在从服务器接收任何状态之前关闭...
在服务器端,我尝试监听响应的完成事件。
checkedFile.on('error', function (err) {
res.status(400);
res.end();
});
res.on('finish', function () {
req.destroy();
});
Run Code Online (Sandbox Code Playgroud)
但无论如何它都会重试。我只是不在乎400。
也许还有另一种取消而不破坏请求流的方法?
第二次编辑:可以在不破坏请求流的情况下结束请求:
checkedFile.on('wrong', …Run Code Online (Sandbox Code Playgroud) node.js ×3
express ×2
javascript ×2
definition ×1
file-upload ×1
http ×1
idempotent ×1
stream ×1