System Information
- 4/latest:
- Windows 10:
- MySQL:
- 14.16.0:
- 6.14.11:
- using just npm:
Bug report
ECONNRESET and ECONNABORT error messages in strapi console
When I spam click F5 in the browser, I get ECONNRESET and ECONNABORT error messages in the strapi console.
Steps to reproduce the behavior
- Create a new strapi project version 3.6.8 or 4/latest
- Start strapi server
- Log in
- Go to Media Library
- upload a mp4 file
- create a simple html file containing a <video src="localhost:1337/uploads/upload_someHash.mp4 controls /> in the body
- open the html
- video should load an work normally
- you should see a 206 get request in the browser network tab and in strapi console
- start spam clicking F5
- you should encounter above mentioned errors after a while in the strapi console
Expected behavior
To not see these errors in the strapi console, because the connection reset or abortion should get handled somewhere.
Screenshots
Code snippets
I can catch the error in node-modules/koa/lib/context.js in the onerror(err) function:
onerror(err) {
// don't do anything if there is no error.
// this allows you to pass `this.onerror`
// to node-style callbacks.
if (null == err) return;
// When dealing with cross-globals a normal `instanceof` check doesn't work properly.
// See https://github.com/koajs/koa/issues/1466
// We can probably remove it once jest fixes https://github.com/facebook/jest/issues/2549.
const isNativeError =
Object.prototype.toString.call(err) === '[object Error]' ||
err instanceof Error;
if (!isNativeError) err = new Error(util.format('non-error thrown: %j', err));
let headerSent = false;
if (this.headerSent || !this.writable) {
headerSent = err.headerSent = true;
}
console.log(err);
// delegate
this.app.emit('error', err, this);
...
I can see the koa-range package beeing involved creating the 206 partial-content response.
In node-modules/koa-range/index.js line 70:
...
console.log(ctx.response.header);
ctx.set('Content-Range', rangeContentGenerator(start, end, len));
ctx.status = 206;
...
I can catch the error and override it with my own console log in node-modules/strapi/lib/Strapi.js. But I don’t like having to override node-module.
class Strapi {
constructor(opts = {}) {
this.reload = this.reload();
// Expose `koa`.
this.app = new Koa();
this.router = new Router();
this.initServer();
// Logger.
this.log = logger;
this.app.on("error", (error) => {
if (error.code === "ECONNABORTED" || error.code === "ECONNRESET") {
this.log.debug("video stream was aborted by client", { error });
} else {
this.log.error("Koa app-level error", { error });
}
});
...
I can also see the error in ./config/bootstrap.js. But this does not override the logger, I then get 2 messages in the console:
module.exports = async () => {
console.log("bootstrap.js");
strapi.app.on("error", (error) => {
if (error.code === "ECONNABORTED" || error.code === "ECONNRESET") {
strapi.log.debug("video stream was aborted by client", { error });
} else {
strapi.log.error("Koa app-level error", { error });
}
});
...
Additional context
A simple koa setup serves the mp4 with request 200 - no problems there
I have yet to build a simple koa setup using koa-range and serve the files with 206. Would be interesting to see what happens.
Opend a thread in github issues: https://github.com/strapi/strapi/issues/12461
My question is: Is it ok to just ignore these error messages? Nothing breaks or crashes, the videos play just fine. And if yes where would be the best place to catch them?