Page Contents

Overview

LoopBack is built on Express and implements Express’ routing system. However, basic Express routing is limited only to a small portion of the functionality of LoopBack. A large part of LoopBack’s features are implemented using its more detailed extension to the routing system. Understanding this system will help you understand LoopBack better and develop better LoopBack apps.

Summary of Express routing

For those not familiar with routing in Express, here are some key points:

  • Routing refers to the rules for capturing requests to the server, and the subsequent passing through and handling of requests through a chain of middleware functions.

  • A middleware function accepts three objects, the request object (req), the response object (res), and the next middleware in the chain (next); in that order.

  • You load middleware either using app.use() or by assigning it as the callback function of a route definition.

  • Multiple middleware can be matched to handle the requests to a route, these matched middleware make up the middleware chain for the request. The request will pass through each middleware in the order they were loaded, unless one of the middleware in the chain terminates the propagation.

  • Any middleware in the chain may terminate the request propagation by sending a response back to the client.

  • A middleware can send the response to the request using one of the response methods in the response object or pass on the request to the next middleware by calling next().

  • If a middleware sends the server response, conventionally the request does not propagate further in the middleware chain. Any call to next() will likely result in an error.

  • A middleware function can also take four arguments. In this case, it is an error handling middleware. The parameters to the function in their order are: the error object (err), the request object (req), the response object (res), and the next middleware in the chain (next).

For more details about routing in Express, see http://expressjs.com/guide/routing.html.

LoopBack routing

LoopBack implements the middleware pattern of request routing, therefore the concept of middleware and routing is the same as in Express. However, the Express aspect of routing is contained within the modified middleware chain generated by LoopBack. The extended routing details in LoopBack is best understood by understanding the LoopBack middleware chain.

LoopBack middleware chain

The LoopBack middleware chain is composed of middleware added to the chain in the following order, and the request passes through them in the given order.

  1. initial:before
  2. initial
  3. initial:after
  4. session:before
  5. session
  6. session:after
  7. auth:before
  8. auth
  9. auth:after
  10. parse:before
  11. parse
  12. parse:after
  13. routes:before
  14. Express middleware
  15. Components
  16. Boot scripts
  17. routes
  18. routes:after
  19. files:before
  20. files
  21. files:after
  22. final:before
  23. final
  24. final:after

A middleware loaded earlier in the chain gets the prior opportunity to handle the request. If it happens to send a response or fail to call next(), the request will terminate at it, and not propagate any further.

As evident from the list above, LoopBack takes control of the loading order of the middleware in the app, and prioritizes its relevant middleware over those loaded using Express’ interface app.use(), components, or boot scripts.

The middleware to be loaded during the middleware phases are configured in the middleware.json file of the app. The order of the phases in the file are semantic, and cannot be listed randomly.

LoopBack also supports custom phases. Custom phases can be defined in any position of the middleware chain, and may be used to prioritize over LoopBack’s built-in middleware phases.

Loading middleware

LoopBack middleware are declaratively loaded using the middleware.json file, or imperatively using the app.middleware() method.

Express middleware can be loaded in the server.js file using app.use() or a route definition.

LoopBack components can load middleware using the reference to the LoopBack application instance.

Boot scripts can load middleware using the reference to the LoopBack application instance.