相关疑难解决方法(0)

811
推荐指数
13
解决办法
22万
查看次数

超时POST请求的浏览器重试行为不一致

当由于超时而没有来自服务器的响应时,我偶尔会遇到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分钟后超时请求.

retry.js

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)

google-chrome http node.js

18
推荐指数
1
解决办法
1万
查看次数

如何在Formidable(Node.js)中取消用户上传?

我已经在这个问题上工作了两天了,我被卡住了.我正在使用带有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)

javascript file-upload node.js express

12
推荐指数
3
解决办法
7304
查看次数

如何手动取消服务器上的 XMLHttpRequest 文件上传(流)

我正在使用 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)

javascript xmlhttprequest stream node.js express

5
推荐指数
1
解决办法
3095
查看次数