use method

App use(
  1. dynamic path, [
  2. dynamic middleware
])

Register middleware(s) or apply a router

We can use it like this.

app.use(middleware); // single

app.use([ middleware1, middleware2 ]); // multiple

or with a specified path like this.

app.use('/login', authMiddleware);

app.use('/login', [ middleware1, middleware2 ]);

To use it to apply a router.

app.use(router); // apply the router for root

or

app.use('/api', router); // apply the router for /api

Implementation

App use(path, [middleware]) {
  bool isRouter = false;
  bool isMiddleware = false;

  // if only use 1 parameter (path)
  if (middleware == null) {
    // use for router, such as
    // app.use(router);
    if (path is Router) {
      isRouter = true;
    }

    // single middleware, such as
    // app.use(middleware);
    else if (path is Callback) {
      isMiddleware = true;
    }

    // multiple middlewares, such as
    // app.use([ middleware1, middleware2 ]);
    else if (path is List && path.isNotEmpty) {
      if (path.first is Callback) {
        isMiddleware = true;
      }
    }
  }

  // if use both parameter with correct path (string)
  if (path is String) {
    // use for router, such as
    // app.use('/api', router);
    if (middleware is Router) {
      isRouter = true;
    }

    // single middleware, such as
    // app.use('/api', middleware);
    else if (middleware is Callback) {
      isMiddleware = true;
    }

    // multiple middlewares, such as
    // app.use('/api', [ middleware1, middleware2 ]);
    else if (middleware is List && middleware.isNotEmpty) {
      if (middleware.first is Callback) {
        isMiddleware = true;
      }
    }
  }

  if (isRouter) {
    return _useRouter(path, middleware);
  }

  if (isMiddleware) {
    return _useMiddleware(path, middleware);
  }

  return this;
}