提问人:Stepan Kuzmin 提问时间:10/28/2017 更新时间:10/29/2017 访问量:1716
Koa.js 和流媒体。你如何处理错误?
Koa.js and streaming. How do you handle errors?
问:
有人使用 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);
如果用户中止请求,我得到
Error: read ECONNRESET
at _errnoException (util.js:1024:11)
at TCP.onread (net.js:618:25)
或
Error: write EPIPE
at _errnoException (util.js:1024:11)
at WriteWrap.afterWrite [as oncomplete] (net.js:870:14)
处理此类错误的正确方法是什么?
附言使用快递请求中止后我没有错误
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);
附言我试过了
app.use(async (ctx) => {
fs.createReadStream('really-large-file').pipe(ctx.res);
ctx.respond = false;
});
但它没有效果。
答:
-2赞
Holger Will
10/29/2017
#1
使用 gloabel 错误处理程序。查看 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);
评论
0赞
Stepan Kuzmin
10/29/2017
遗憾的是,此处理程序不会捕获 ECONNRESET 错误。
0赞
Holger Will
10/29/2017
对不起,我没有注意......a (可读的)Stream 是不可等待的(你没有尝试过;-)),所以你无法在那里捕获错误。您必须承诺您的文件加载才能使其正常工作......更新了答案...
5赞
Stepan Kuzmin
10/30/2017
这样做的问题在于,您将文件内容传递到内存中,然后将其解析到响应正文中。这不是您应该如何实现流式处理。我可以读取文件内容并将其传递给正文。readFileSync
0赞
Zach Smith
8/23/2022
通过仅在读取流的末尾解析数据...这将取消流式传输
评论