CNode

在koa里,怎么处理超时的请求?

问答
Hhwoarangzk发布于11 年前最后回复11 年前9 回复9953 浏览0 收藏

比如处理某一个请求,假设响应时间超过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)

Z
zhangking520#1·11 年前

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

H
hwoarangzk#2·11 年前

setTimeout真心没用的。。。

J
joesonw#3·11 年前

koa-timeout

H
hwoarangzk#4·11 年前

@joesonw 多谢~我去试试

H
hwoarangzk#5·11 年前

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

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

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

H
hwoarangzk#7·11 年前

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

H
hwoarangzk#9·11 年前

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

参与回复
登录后即可参与回复。登录