服务器响应500错误时触发XMLHttp?Request?.upload.onprogress

Mat*_*att 7 javascript ajax http xmlhttprequest

我使用XMLHttp?Request上传文件。如果服务器响应错误消息500,我尝试在onprogress事件发生前处理错误消息。

XMLHttpRequest

const xhr = new XMLHttpRequest();

      xhr.onreadystatechange = function (oEvent) {
        if (xhr.readyState === 4) {
            if (xhr.status === 500) {
              console.log('error2');
            }
        }
    };

    xhr.onload = function() {
      if (this.status == 200) {
        console.log('success');
      }
    };

      xhr.upload.onprogress = function(e) {
        if (e.lengthComputable) {
          var percentComplete = (e.loaded / e.total) * 100;
          console.log(percentComplete);
        }
      };

      xhr.open("POST", "http://127.0.0.1:1337/upload-file", true);
      var formData = new FormData();
      formData.append("file", e.file);
      xhr.send(formData);
Run Code Online (Sandbox Code Playgroud)

我故意在服务器上抛出错误消息:

const Koa = require('koa');
const Router = require('koa-router');
const cors = require('@koa/cors');
const serve = require('koa-static');
const path = require('path');
const koaBodyMultipart = require('koa-body')({ multipart: true });

const app = new Koa();
app.use(cors());
app.use(serve(path.join(process.env.PWD, '/dist')));

const router = new Router();

router
  .post('/upload-file', koaBodyMultipart, (ctx, next) => {
    const { file } = ctx.request.files;
    // if (file) {
    //     ctx.response.body = 'ok';
    // } else {
    //     ctx.throw(500,'Error Message');
    // }
    ctx.throw(500,'Error Message');
  });

app.use(router.routes()).use(router.allowedMethods());

// don't listen to this port if the app is required from a test script
if (!module.parent) {
  var server = app.listen(process.env.PORT || 1337);
  var port = server.address().port;
  console.log('running at port:' + port)
}
Run Code Online (Sandbox Code Playgroud)

为什么upload.onprogress在之前xhr.onreadystatechange和之后被触发xhr.onload?在显示上传进度之前如何显示错误消息?

Tia*_*lho 0

根据XMLHttpRequest Level 2 - 确定上传是否完成

发送和接收数据时会调用进度,这就是发送文件时发生的情况,即使响应是错误也是如此。仅当所有操作完成且服务器关闭连接后,才会触发状态更改事件。