Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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
Dart 来自未来对象的输出的服务器响应_Dart_Server_Future_Dart Shelf - Fatal编程技术网

Dart 来自未来对象的输出的服务器响应

Dart 来自未来对象的输出的服务器响应,dart,server,future,dart-shelf,Dart,Server,Future,Dart Shelf,我在另一个文件中创建了一个异步/等待函数,因此它的处理程序将返回一个未来的对象。现在我不明白如何用Dart中未来对象的内容来响应客户机。我正在使用带shelf包的基本dart服务器。下面是ht.handler('list')返回未来对象的代码,我想将该字符串作为响应发送给客户端。但我得到了内部服务器错误 import 'dart:io'; import 'package:args/args.dart'; import 'package:shelf/shelf.dart' as shelf; i

我在另一个文件中创建了一个异步/等待函数,因此它的处理程序将返回一个未来的对象。现在我不明白如何用Dart中未来对象的内容来响应客户机。我正在使用带shelf包的基本dart服务器。下面是ht.handler('list')返回未来对象的代码,我想将该字符串作为响应发送给客户端。但我得到了内部服务器错误

import 'dart:io';

import 'package:args/args.dart';
import 'package:shelf/shelf.dart' as shelf;
import 'package:shelf/shelf_io.dart' as io;
import 'HallTicket.dart' as ht;

// For Google Cloud Run, set _hostname to '0.0.0.0'.
const _hostname = 'localhost';

main(List<String> args) async {
  var parser = ArgParser()..addOption('port', abbr: 'p');
  var result = parser.parse(args);

  // For Google Cloud Run, we respect the PORT environment variable
  var portStr = result['port'] ?? Platform.environment['PORT'] ?? '8080';
  var port = int.tryParse(portStr);

  if (port == null) {
    stdout.writeln('Could not parse port value "$portStr" into a number.');
    // 64: command line usage error
    exitCode = 64;
    return;
  }

  var handler = const shelf.Pipeline()
      .addMiddleware(shelf.logRequests())
      .addHandler(_echoRequest);

  var server = await io.serve(handler, _hostname, port);
  print('Serving at http://${server.address.host}:${server.port}');
}

Future<shelf.Response> _echoRequest(shelf.Request request)async{
    shelf.Response.ok('Request for "${request.url}"\n'+await ht.handler('list'));
}
导入'dart:io';
导入“包:args/args.dart”;
导入“包装:货架/货架.省道”作为货架;
导入“包装:货架/货架io.dart”作为io;
将“HallTicket.dart”作为ht导入;
//对于Google云运行,将主机名设置为“0.0.0.0”。
const_hostname='localhost';
主(列表参数)异步{
var parser=ArgParser()…addOption('port',缩写为'p');
var result=parser.parse(args);
//对于GoogleCloud运行,我们考虑端口环境变量
var-portStr=result['port']??Platform.environment['port']??8080';
var port=int.tryParse(portStr);
如果(端口==null){
writeln('无法将端口值“$portStr”解析为数字');
//64:命令行使用错误
exitCode=64;
返回;
}
var handler=const shelf.Pipeline()
.addMiddleware(shelf.logRequests())
.addHandler(_echoRequest);
var server=await io.service(处理程序、主机名、端口);
打印('服务于http://${server.address.host}:${server.port}');
}
Future\u echoRequest(shelf.Request)异步{
self.Response.ok(“${Request.url}”的请求\n'+wait ht.handler('list'));
}

分析仪为您的
\u echoRequest
方法发出以下警告:

信息:此函数的返回类型为“Future”,但 不会以return语句结束

如果您检查
addHandler
的要求,您将看到它期望返回一个处理程序

因此,您需要添加使其在我的机器上工作的退货:

Future<shelf.Response> _echoRequest(shelf.Request request) async {
  return shelf.Response.ok(
      'Request for "${request.url}"\n' + await ht.handler('list2'),
      headers: {'Content-Type': 'text/html'});
}
Future\u echoRequest(shelf.Request)异步{
返回shelf.Response.ok(
'对“${Request.url}”的请求\n'+wait ht.handler('list2'),
标题:{'Content-Type':'text/html'});
}

下载是什么意思?在我的Firefox浏览器中,它只显示响应。在Firefox中,它检测到响应为application/octet流。仍在以文件形式下载。听起来像是
shelf.Response.ok
方法中记录的:“如果传递了[encoding],则[headers]中内容类型头的“encoding”字段将被适当设置。如果没有现有的内容类型头,它将被设置为“application/octet stream”。”更新了我的答案,以显示如何设置内容类型。