1

似乎有架子和 rpc 包之间的不兼容。

在 rpc [0.4.1] config/api.dart 中:handleHttpOptionsRequest 期望 'access-control-request-method' 标头是一个列表:

    Future<HttpApiResponse> handleHttpOptionsRequest(
          ParsedHttpApiRequest request) async {
        var requestedHttpMethods = request.headers['access-control-request-method'];
        List<String> allowed = [];
        assert('OPTIONS'.allMatches(request.methodKey).length == 1);
        if (requestedHttpMethods != null) {
          requestedHttpMethods.forEach((httpMethod) {
            var methodKey =
                request.methodKey.replaceFirst('OPTIONS', httpMethod);
            final List<ApiConfigMethod> methods = _methodMap[methodKey];
            if (methods != null) {
              for (var method in methods) {
                if (method.matches(request)) {
                  allowed.add(httpMethod);
                  break;
               }
              }
            }
          });
        }

当使用架子 [0.5.7] 包时,传递给此方法的 ParsedHttpApiRequest 包含一个“访问控制请求方法”标头,它是一个字符串。

这会产生一个异常......

将 rpc 与 dart.io HttpServer 一起使用时,代码可以正常工作,并且 ParsedHttpApiRequest 有一个字符串列表(带有单个元素)作为“访问控制请求方法”标头的值。

有人成功使用 dart rpc + Shelf 吗?如果是这样,关于如何避免异常的任何想法?

=== [更新] rpc 修复后,前面提到的问题似乎已修复。感谢那!我现在遇到另一个问题,但我还没有详细调查。堆栈跟踪是:

货架[0.5.7]货架_rpc [0.0.3] RPC [0.4.2]:

     Error thrown by handler.
     type 'List' is not a subtype of type 'String' of 'value'.
     package:collection/src/canonicalized_map.dart 66:30  CanonicalizedMap.[]=
     package:collection/src/canonicalized_map.dart 71:39  CanonicalizedMap.addAll.<fn>
     dart:collection                                      _CompactLinkedHashMap.forEach
     package:collection/src/canonicalized_map.dart 71:18  CanonicalizedMap.addAll
     package:collection/src/canonicalized_map.dart 57:11  CanonicalizedMap.CanonicalizedMap.from
     package:shelf/src/response.dart 215:9                Response.Response
     package:shelf_rpc/shelf_rpc.dart 18:24               createRpcHandler.<fn>.<fn>

=>在运行 dart rpc 和与作为列表(而不是字符串)的标题相关的架子(带有架子 rpc)时查看不兼容性

4

1 回答 1

4

这是 RPC 包中的一个错误。我会尽快解决这个问题并发布新版本的 RPC 包。

欢迎您在 github 下提交此类问题:

https://github.com/dart-lang/rpc/issues

干杯,/古斯塔夫

于 2015-05-05T09:04:27.743 回答