2

我试图从完成者那里发现一个错误。

在这里,我解码令牌的方法

  Future<Map> decode(String token) {
    var completer = new Completer();

    new Future(() {
      List<String> parts = token.split(".");
      Map result = {};

      try {
        result["header"] = JSON.decode(new String.fromCharCodes(crypto.CryptoUtils.base64StringToBytes(parts[0])));
        result["payload"] = JSON.decode(new String.fromCharCodes(crypto.CryptoUtils.base64StringToBytes(parts[1])));
      } catch(e) {
        completer.completeError("Bad token");
        return;
      }
      encode(result["payload"]).then((v_token) {
        if (v_token == token) {
          completer.complete(result);
        } else {
          completer.completeError("Bad signature");
        }
      });
    });
    return completer.future;
  }
}

来电:

  var test = new JsonWebToken("topsecret");

  test.encode({"field": "ok"}).then((token) {
    print(token);
    test.decode("bad.jwt.here")
      ..then((n_tok) => print(n_tok))
      ..catchError((e) => print(e));
  });

这是输出

dart server.dart
eyJ0eXAiOiJKV1QiLCJhbGciOiJTSEEyNTYifQ==.eyJsdSI6Im9rIn0=.E3TjGiPGSJOIVZFFECJ0OSr0jAWojIfF7MqFNTbFPmI=
Bad token
Unhandled exception:
Uncaught Error: Bad token
#0      _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:820)
#1      _asyncRunCallbackLoop (dart:async/schedule_microtask.dart:41)
#2      _asyncRunCallback (dart:async/schedule_microtask.dart:48)
#3      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:126)

我不明白为什么我们告诉我我的错误在打印时没有被发现......

4

2 回答 2

3

我认为您滥用了 .. 而不是 . 用于链接未来。见https://www.dartlang.org/docs/tutorials/futures/#handling-errors

代替

test.decode("bad.jwt.here")
  ..then((n_tok) => print(n_tok))
  ..catchError((e) => print(e));

你能试一下吗

test.decode("bad.jwt.here")
  .then((n_tok) => print(n_tok))
  .catchError((e) => print(e));
于 2014-10-14T11:50:30.423 回答
2

查看有关 Futures 如何工作的文档 - https://www.dartlang.org/articles/futures-and-error-handling/

特别是有一个例子说:

myFunc()
  .then((value) {
    doSomethingWith(value);
    ...
    throw("some arbitrary error");
  })
  .catchError(handleError);

如果 myFunc() 的 Future 以错误完成,则 then() 的 Future 以该错误完成。错误也由 catchError() 处理。

无论错误是源自 myFunc() 还是源自 then(),catchError() 都会成功处理它。

这与您所看到的一致。

于 2014-10-14T00:15:17.660 回答