2017-10-28 281 views
4

有没有人与koa.js和流一起工作?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) 

什么是处理这种类型的错误的正确方法?

P.S.我没有错误,请求与快递

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; 
}); 

但它没有效果。

回答

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

不幸的是,此处理程序不会捕获ECONNRESET错误。 –

+0

抱歉,我没有注意到...一个(可读的)流不等待(你没有尝试;-)),所以你不能在那里发现错误。你必须promisify你的文件加载得到它的工作...更新答案... –

+1

这个问题是你将文件内容传递到内存,然后将其解析到响应主体。这不是你应该如何实现流媒体。我可以用'readFileSync'读取文件内容并将其传递给主体。 –