【问题标题】:Server response with output from Future Object来自未来对象的输出的服务器响应
【发布时间】:2020-03-24 04:50:12
【问题描述】:

我在另一个文件中创建了一个 async/await 函数,因此它的处理程序返回了一个 Future 对象。现在我不明白如何用 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 server future dart-shelf


    【解决方案1】:

    分析器为您的_echoRequest 方法发出以下警告:

    info:此函数的返回类型为“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'});
    }
    

    【讨论】:

    • 下载是什么意思?在我的 Firefox 浏览器中,它只显示响应。
    • 在 Firefox 中,它检测到它是 application/octet-stream。仍在将其作为文件下载。
    • shelf.Response.ok 方法中记录的类似这样的声音:“如果 [encoding] 被传递,[headers] 中 Content-Type 标头的“encoding”字段将被适当设置。如果没有现有的 Content-Type 标头,它将被设置为“application/octet-stream”。”
    • 更新了我的答案,显示了如何设置 Content-Type。
    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多