2017-10-28 23 views
4

誰もkoa.jsとストリームで動作しますか?Koa.jsとストリーミング。どのようにエラーを処理しますか?

ユーザが要求を中断した場合、私はエラーのこのタイプを処理するための適切な方法は何ですか?

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 Koa = require('koa'); 

const app = new Koa(); 

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

app.listen(4000); 

を考えてみましょうか

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

グローブエラーハンドラを使用してください。 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

申し訳ありませんが、私は注意を払っていませんでした...(読み込み可能な)ストリームはお待ちください(あなたは試していませんでした;-))ので、そこにエラーをキャッチすることはできません。あなたはそれを動作させるためにあなたのファイルの読み込みを約束しなければなりません...答えを次のように更新しました... –

+1

これは、ファイル内容をメモリに渡してから、応答本体に解決するという問題です。これはストリーミングを実装する方法ではありません。 'readFileSync'でファイルの内容を読み込み、それを本文に渡すことができます。 –

関連する問題