2016-05-11 4 views
1

別のリクエストを使用して、どのようにkoa.jsでリクエストを終了できますか?アクティブなリクエストコンテキストをオブジェクト内に保持しているとします。リクエストAが開始され、時間がかかると仮定します。要求Aを終了するように指示する別の要求を行うにはどうすればよいですか。Koa.js実行中のリクエストを中止します

var requests = {}; 

// middleware to track requests 
app.use(function*(next) { 
    var reqId = crypto.randomBytes(32).toString('hex'); 
    requests[reqId] = { 
     context: this 
    } 

    yield next; 

    delete requests[reqId]; 
    } 
); 

    // route to kill request using ID generated from middleware above 
    router.get('/kill/:reqId', function *(next) { 
    var req = requests[this.params.reqId]; 

    if (req) { 
     // abort request here 
    } else { 
     this.body = { 
     error: 'Request not found' 
     }; 
    } 
    }); 
+0

定期的にチェックするキャンセルトークンを実装する必要があります。 – Jeff

答えて

2

定期的に確認する取り消しトークンを実装する必要があります。

例:

// Factory to create a token 
const cancellationToken =() => { 
    let _cancelled = false; 

    function check() { 
    if (_cancelled == true) { 
     throw new Error('Request cancelled'); 
    } 
    } 

    function cancel() { 
    _cancelled = true; 
    } 

    return { 
    check: check, 
    cancel: cancel 
    }; 
} 


const reqs = {}; 

// Middleware to create tokens. 
app.use(function *(next) { 
    const reqId = crypto.randomBytes(32).toString('hex'); 
    const ct = cancellationToken(); 
    reqs[reqId] = ct; 
    this.cancellationToken = ct; 
    yield next; 

    delete reqs[reqId]; 
}); 

// route to kill request using ID generated from middleware above 
router.get('/kill/:reqId', function *(next) { 
    const ct = requests[this.params.reqId]; 

    if (ct) { 
    ct.cancel(); 
    } else { 
    this.body = { 
     error: 'Request not found' 
    }; 
    } 
}); 

// A request checking for cancellation. 
router.get('/longrunningtask', function *(next) { 
    for (let i = 0; i < 1000; i++) { 
    yield someLongRunningTask(i); 
    // This is where you check to see if you're done. 
    // The method will throw and abort the request. 
    this.cancellationToken.check(); 
    } 
}); 

あなたがそこにキャンセルを制御することができますので、あなたもsomeLongRunningTask関数にキャンセルトークンに沿って渡すことができます。

+0

ああクール、私はそれを試してみる、ありがとう! –

+0

私はミドルウェアでcheck()を実行するために 'setInterval'を実行しようとしましたが、ノードプロセス全体が強制終了されました。 setIntervalで作業することができるかどうかは何ですか? –

+0

エラーがスローされ、キャッチされないためです。 – Jeff

関連する問題