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
?在显示上传进度之前如何显示错误消息?
根据XMLHttpRequest Level 2 - 确定上传是否完成
发送和接收数据时会调用进度,这就是发送文件时发生的情况,即使响应是错误也是如此。仅当所有操作完成且服务器关闭连接后,才会触发状态更改事件。