在koa里,怎么处理超时的请求?
发布于 9 年前 作者 hwoarangzk 9158 次浏览 最后一次编辑是 8 年前 来自 问答

比如处理某一个请求,假设响应时间超过1s了,我就想在页面里显示timeout:

var app = require('koa')();

app.use(function *(next) {
    var start = new Date();
	yield next;
});

app.use(function *(next) {
    var result = yield loadData();
	this.body = result;
});

app.listen(8080);

比如这么一段简单的代码,loadData假设超过1s没有结果返回我就认为是超时,想this.body = timeout。这种怎么写呢?setTimeout应该是无法完成这个要求的吧

9 回复

这样呢 app.use(function*(next){ this.timeout = setTimeout(function(){ this.body = ‘timeout’; }.bind(this),1000); yield next; }); 返回前将this.timeout=null;

setTimeout真心没用的。。。

@joesonw 多谢~我去试试

另外不说koa,node本身对请求的超时响应是怎么处理的呢?我看req和res都有setTimeout方法,但写了点代码,貌似没效果,正确的使用姿势 = ?

@hwoarangzk 你看koa-timeout的源码。一个数据库操作,和一个setTimeout同时进行。如果setTimeout先运行,说明超时,如果不超时,则解除setTimeout

@joesonw 嗯,刚刚用了koa-timeout,确实能满足我的需求。但是我想,比如遇到一个req超时后,想页面显示一个固定的出错信息,同时终止这次超时请求的后续处理,应该怎么做到呢?

@hwoarangzk 你看example,就是这样的啊。因为超时了会throw error,会回到最上面一层的middleware。后面的不会执行。

如果对于线程阻塞的操作,这个就没法触发那个setTimeout啊

回到顶部