Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 使用Futures时已发送Dart AppEngine标头_Google App Engine_Dart - Fatal编程技术网

Google app engine 使用Futures时已发送Dart AppEngine标头

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

我正在使用AppEngine,并用Dart编写了一个服务器应用程序。由于gcloudapi在几乎所有方面都使用Futures,因此我也使用它们。然而,问题是,一旦我开始使用Futures,就会抛出一个
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);
正如您所看到的,通过首先发送头,问题得到了解决