koa 是否为取消的请求提供服务?
Does koa serve canceled requests?
我在 koa 中有一个端点,它从数据库加载大量数据,然后根据它计算一些结果。这可能需要几秒钟。
如果浏览器取消请求,请求会怎样?比如浏览器选项卡关闭等
例如,即使浏览器取消或 koa 足够聪明,可以简单地停止它为此请求启动的任何操作,cache.c
是否会被填充?
const cache = {}
router.get('/data', function *(next) {
if (cache.c) return this.body = cache.c
// somewhere here the browser cancels the request
//---
const a = yield db.getA()
const b = yield db.getB()
cache.c = yield calculateC(a,b)
//---
this.body = cache.c
})
无论请求套接字何时关闭(例如,用户关闭选项卡),您的生成器函数都将完整地获得 yielded/evaluated。
仅仅因为套接字关闭就停止进一步的生成器执行不是 Koa 可以做出的假设。
例如,想象一下如果 Koa 自动停止生成器执行并且用户在 yield query('ROLLBACK')
有机会清理数据库连接之前关闭套接字。现在你有一个糟糕的数据库连接卡在池中。也许还有比这更好的理由。
所以,是的,Koa 一直执行你的生成器函数,直到它完成,此时响应通过你的中间件返回气泡并返回到 Koa 的控制,因为套接字关闭后它无处可去。
如果您想知道用户何时关闭选项卡以便您可以实现自己的短路行为,您可以在请求套接字上侦听 "close"
事件:
const cache = {}
router.get('/data', function *(next) {
if (cache.c) return this.body = cache.c;
var closed = false;
this.request.socket.on('close', function() {
closed = true;
});
if (closed) return;
const a = yield db.getA();
if (closed) return;
const b = yield db.getB();
if (closed) return;
cache.c = yield calculateC(a,b);
this.body = cache.c;
})
我在 koa 中有一个端点,它从数据库加载大量数据,然后根据它计算一些结果。这可能需要几秒钟。
如果浏览器取消请求,请求会怎样?比如浏览器选项卡关闭等
例如,即使浏览器取消或 koa 足够聪明,可以简单地停止它为此请求启动的任何操作,cache.c
是否会被填充?
const cache = {}
router.get('/data', function *(next) {
if (cache.c) return this.body = cache.c
// somewhere here the browser cancels the request
//---
const a = yield db.getA()
const b = yield db.getB()
cache.c = yield calculateC(a,b)
//---
this.body = cache.c
})
无论请求套接字何时关闭(例如,用户关闭选项卡),您的生成器函数都将完整地获得 yielded/evaluated。
仅仅因为套接字关闭就停止进一步的生成器执行不是 Koa 可以做出的假设。
例如,想象一下如果 Koa 自动停止生成器执行并且用户在 yield query('ROLLBACK')
有机会清理数据库连接之前关闭套接字。现在你有一个糟糕的数据库连接卡在池中。也许还有比这更好的理由。
所以,是的,Koa 一直执行你的生成器函数,直到它完成,此时响应通过你的中间件返回气泡并返回到 Koa 的控制,因为套接字关闭后它无处可去。
如果您想知道用户何时关闭选项卡以便您可以实现自己的短路行为,您可以在请求套接字上侦听 "close"
事件:
const cache = {}
router.get('/data', function *(next) {
if (cache.c) return this.body = cache.c;
var closed = false;
this.request.socket.on('close', function() {
closed = true;
});
if (closed) return;
const a = yield db.getA();
if (closed) return;
const b = yield db.getB();
if (closed) return;
cache.c = yield calculateC(a,b);
this.body = cache.c;
})