Koa.js 和流媒体。你如何处理错误?

Ste*_*min 5 javascript error-handling streaming koa koa2

有人使用 koa.js 和流吗?

考虑这个例子

const fs = require('fs');
const Koa = require('koa');

const app = new Koa();

app.use(async (ctx) => {
  ctx.body = fs.createReadStream('really-large-file');
});

app.listen(4000);
Run Code Online (Sandbox Code Playgroud)

如果用户中止请求我得到

  Error: read ECONNRESET
      at _errnoException (util.js:1024:11)
      at TCP.onread (net.js:618:25)
Run Code Online (Sandbox Code Playgroud)

或者

  Error: write EPIPE
      at _errnoException (util.js:1024:11)
      at WriteWrap.afterWrite [as oncomplete] (net.js:870:14)
Run Code Online (Sandbox Code Playgroud)

处理此类错误的正确方法是什么?

PS请求中止后我没有错误

const fs = require('fs');
const express = require('express');

const app = express();

app.get('/', (req, res) => {
  fs.createReadStream('really-large-file').pipe(res);
});

app.listen(4000);
Run Code Online (Sandbox Code Playgroud)

我试过的PPS

app.use(async (ctx) => {
  fs.createReadStream('really-large-file').pipe(ctx.res);
  ctx.respond = false;
});
Run Code Online (Sandbox Code Playgroud)

但它没有效果。

Hol*_*ill -2

使用全球错误处理程序。请参阅https://github.com/koajs/koa/wiki/Error-Handling

const fs = require('fs');
const Koa = require('koa');

const app = new Koa();


app.use(async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    ctx.status = err.status || 500;
    ctx.body = err.message;
    ctx.app.emit('error', err, ctx);
  }
});

app.use(async (ctx) => {
  ctx.body = await openFile();
});

function openFile(){
  return new Promise((resolve,reject)=>{
    var stream = fs.createReadStream("really-large-file")
    var data
    stream.on("error",err=>reject(err))
    stream.on("data",chunk=>data+=chunk)
    stream.on("end",()=>resolve(data))
  })
}

app.listen(4000);
Run Code Online (Sandbox Code Playgroud)

  • 这样做的问题是您将文件内容传递到内存中,然后将其解析到响应正文中。这不是您应该实现流式传输的方式。我可以使用“readFileSync”读取文件内容并将其传递给正文。 (5认同)