似乎有架子和 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>