Google app engine 使用Futures时已发送Dart AppEngine标头
我正在使用AppEngine,并用Dart编写了一个服务器应用程序。由于gcloudapi在几乎所有方面都使用Futures,因此我也使用它们。然而,问题是,一旦我开始使用Futures,就会抛出一个Google app engine 使用Futures时已发送Dart AppEngine标头,google-app-engine,dart,Google App Engine,Dart,我正在使用AppEngine,并用Dart编写了一个服务器应用程序。由于gcloudapi在几乎所有方面都使用Futures,因此我也使用它们。然而,问题是,一旦我开始使用Futures,就会抛出一个BadStateException。请参见下面的两个示例 工作服务器 runAppEngine((HttpRequest request) { request.response ..writeln('Hello world') ..statusCode = Htt
BadStateException
。请参见下面的两个示例
工作服务器
runAppEngine((HttpRequest request) {
request.response
..writeln('Hello world')
..statusCode = HttpStatus.OK
..close();
}, port: port);
输出:
你好,世界
服务器不工作:邮件头已发送
Future _asyncTask(HttpRequest request) {
return new Future(() {
request.response
..writeln('Hello world')
..statusCode = HttpStatus.OK; // causes BadStateException
}).catchError((e) {
request.response.writeln(e.toString());
}).whenComplete(() {
request.response.close();
});
}
runAppEngine((HttpRequest request) {
return _asyncTask(request);
}, port: port);
输出:
Hello world状态错误:HTTP头已发送
我想使用Futures,但由于某些原因,我无法摆脱
BadStateException
。有人能指出我做错了什么吗?哦,看来我找到了漏洞。我整天都在寻找解决这个问题的方法,现在我在这里问,五分钟后我发现了这个问题
无论如何,我希望这个答案能帮助有同样问题的人
问题是,在写入响应时,头是隐式设置的。因此,一旦调用writeln(String)
,以后就不能再设置任何头了
第一个服务器代码中没有记录错误的原因是,根本没有记录错误的逻辑,但它与第二个一样错误
以下是正确的方法:
Future _asyncTask(HttpRequest request) {
return new Future(() {
request.response
..statusCode = HttpStatus.OK
..writeln('Hello world');
}).catchError((e) {
request.response.writeln(e.toString());
}).whenComplete(() {
request.response.close();
});
}
runAppEngine((HttpRequest request) {
return _asyncTask(request);
}, port: port);
正如您所看到的,通过首先发送头,问题得到了解决