Javascript Ko.js和流媒体。如何处理错误? 有人和KoaJs和Studio合作吗?
以这个例子为例Javascript Ko.js和流媒体。如何处理错误? 有人和KoaJs和Studio合作吗?,javascript,error-handling,streaming,koa,koa2,Javascript,Error Handling,Streaming,Koa,Koa2,以这个例子为例 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); 如果用户中止请求,我将获得 Error: read ECONNRESET at _errnoEx
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);
如果用户中止请求,我将获得
Error: read ECONNRESET
at _errnoException (util.js:1024:11)
at TCP.onread (net.js:618:25)
或
处理此类错误的正确方法是什么
p.S.使用express中止请求后,我没有任何错误
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);
p.p.S.我已经试过了
app.use(async (ctx) => {
fs.createReadStream('really-large-file').pipe(ctx.res);
ctx.respond = false;
});
但是它没有效果。使用globabel错误处理程序。看
不幸的是,此处理程序未捕获EconReset错误。抱歉,我没有注意。。。(可读)流是不可等待的(您没有尝试;-),因此您无法在那里捕获错误。你必须保证你的文件加载工作。。。相应地更新了答案…问题是您将文件内容传递到内存中,然后将其解析到响应体中。这不是实现流式处理的方式。我可以使用
readFileSync
读取文件内容并将其传递给正文。
app.use(async (ctx) => {
fs.createReadStream('really-large-file').pipe(ctx.res);
ctx.respond = false;
});
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);