.. _Middleware:
**********
Middleware
**********
An :doc:`apps/isomorphic` renders ````-Components at the server-side and returns the rendered html as response
to the client requesting the url. ````-components let you add code executed at the server before the html is returned.
The concept of middlewares is taken directly from `Express.js `_.
Middlewares apply in the order of hierarchy and in the order they are defined in your app! This means, middlewares higher
in the hierarchy (at ```` level) apply before lower-level middlewares (e.g. ````, ````)
Parents
=======
A ```` component is supported as a direct child of an :doc:`apps/isomorphic`, a :doc:`../components/webapp`, or
a :doc:`../components/route`.
Depending on its location, it will have a broader or narrower scope of requests it applies to.
Properties
==========
The ````-component requires you to define the following properties:
* ``callback`` is a function, either ``(req, res, next) => {}`` or ``(err, req, res, next) => {}``
This callback is used as an Express.js-Middleware.
The callback has the following arguments:
* ``req`` is the request-object received from the client. It contains all the information you may want to work with
* ``res`` is the response-object that you can use to return a response to the client, e.g. ``res.status(200).send('Your Response');``. Note: if you respond from within a middleware, following middlewares and any following ````-components will not be called anymore! If you want to provide data to subsequent middlewares, complement the ``req`` object with your data.
* ``next`` is a function that you can call to hand over to the next middleware.
If you specify a middleware with four arguments, i.e. then the first argument is:
* ``err`` an error that has been thrown previously and which you can act on now.
When a middleware throws an error, only subsequent middlewares with error-handling apply. If no error is thrown, middlewares
with an error-handling do **not** apply.