微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Dart 架 - 中间件和处理程序执行顺序

如何解决Dart 架 - 中间件和处理程序执行顺序

我在尝试理解 Dart 架子如何执行中间件和处理程序时迷失了方向。从我读过的所有文档(并简要介绍)中,如果您编写了一个返回 null 的中间件,那么执行将沿着管道进行。 否则,如果中间件返回 Response,则停止管道执行,并将 Response 返回给调用者。

我有一个带有这样简单管道的服务器:

    var handler = const shelf.Pipeline()
    .addMiddleware(shelf.logRequests())
//.addMiddleware(options)
    .addMiddleware(auth)
    .addHandler(Router.handle);

auth 中间件检查 3 种情况:注册登录和验证。

  • 注册 -> 创建新用户并返回 Response.ok(token),如果不可能则返回 Response.InternalServerError
  • 登录 -> 刷新令牌并返回 Response.ok(token),如果不正确则返回 Response(401)
  • Verify -> ok 时返回 null(应该继续沿管道向下),或 Response(403,forbidden)

问题是,我无法停止中间件的执行。如果我成功登录,程序仍然会沿着管道运行并调用路由器。哪个当然没有注册路径并按预期返回404。

根据货架文档,它应该在中间件返回响应时停止。我到底做错了什么?

这是auth Middleware的代码供参考:

    abstract class AuthProvider {
      static JsonDecoder _decoder = const JsonDecoder();
    
      static FutureOr<Response> handle(Request request) async {
        print('Entering auth middleware');
        if(request.url.toString() == 'login'){
          print('into login from auth');
          AuthProvider.auth(request);
        }
        else if(request.url.toString() == 'register'){
          print('Into register from auth');
          RegisterController.handle(request);
        }
        else {
          print('Into verify from auth');
          AuthProvider.verify(request);
        }
      }
    
      static FutureOr<Response> auth(Request request) async {
        print('Entering auth');
        String sql;
        var query = ExecQuery();
        try {
          dynamic data = jsonDecode(await request.readAsstring()) as Map<String,dynamic>;
          final user = data['email'].toString();
          final hash = Hash.create(data['password'].toString());
          sql =
          '''SELECT COUNT(*) FROM public.user WHERE (email = '${user}' AND password = '${hash}')''';
          await query.countsql(sql);
          if (query.result.status && query.result.opResult[0][0] == 1) {
            JwtClaim claim = JwtClaim(
              subject: user,issuer: 'Me',audience: ['users'],);
            final token = issueJwtHS256(claim,config.secret);
            sql = '''UPDATE public.user SET token = '${token}'
              WHERE (email = '${user}' AND password = '${hash}')''';
            await query.rawQuery(sql);
            return Response.ok(token);
          }
          else{throw Exception();}
        } catch (e) {
          return Response(401,body: 'Incorrect username/password');
        }
      }
    
      static FutureOr<Response> verify(Request request) async {
        print('Entering verify');
        try {
          final token = request.headers['Authorization'].replaceAll('Bearer ','');
          print('Received token: ${token}');
          final claim = verifyJwtHS256Signature(token,config.secret);
          print('got the claim');
          claim.validate(issuer: 'Acme Widgets Corp',audience: 'homacenter');
          print ('returning null in middleware');
          return null;
        } catch(e) {
          print(e.toString());
          return Response.forbidden('Authorization rejected');
        }
      }
    }

解决方法

我自己回答......在这方面失去了几天之后,回报丢失了,这使得管道继续运行。问题已关闭。

abstract class AuthProvider {
  static JsonDecoder _decoder = const JsonDecoder();

  static FutureOr<Response> handle(Request request) async {
    if(request.url.toString() == 'login'){
      return AuthProvider.auth(request);
    }
    else if(request.url.toString() == 'register'){
      return RegisterController.handle(request);
    }
    else {
      return AuthProvider.verify(request);
    }
  }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。