From 5cff80ae0efa32cdaaef39f132fce86e2ec3f9d9 Mon Sep 17 00:00:00 2001 From: Yaapa Hage Date: Thu, 26 Mar 2020 20:00:12 +0530 Subject: [PATCH] docs: differences between LB3 and LB4 req-res cycle Differences between LB3 and LB4 req-res cycle --- .../site/LB3-vs-LB4-request-response-cycle.md | 488 ++++++++++++++++++ docs/site/imgs/lb3-req-res.png | Bin 0 -> 26675 bytes docs/site/imgs/lb4-req-res.png | Bin 0 -> 27605 bytes docs/site/sidebars/lb4_sidebar.yml | 4 + 4 files changed, 492 insertions(+) create mode 100644 docs/site/LB3-vs-LB4-request-response-cycle.md create mode 100644 docs/site/imgs/lb3-req-res.png create mode 100644 docs/site/imgs/lb4-req-res.png diff --git a/docs/site/LB3-vs-LB4-request-response-cycle.md b/docs/site/LB3-vs-LB4-request-response-cycle.md new file mode 100644 index 000000000000..ecd2f02973bf --- /dev/null +++ b/docs/site/LB3-vs-LB4-request-response-cycle.md @@ -0,0 +1,488 @@ +--- +lang: en +title: 'Differences in LoopBack 3 and LoopBack 4 request/response cycle' +keywords: LoopBack 4.0, LoopBack 4, LoopBack 3.0, LoopBack 3 +sidebar: lb4_sidebar +permalink: /doc/en/lb4/LB3-vs-LB4-request-response-cycle.html +--- + +## Differences between LoopBack 3 and LoopBack 4 request/response cycle + +The request/response cycle infrastructure and pathway are very different in +LoopBack 3 and LoopBack 4. Knowing the differences will help you migrate +LoopBack 3 applications to LoopBack 4 and implement new request/response related +features in LoopBack 4. + +This document will guide you through the differences and show the LoopBack 4 +equivalent, if there is any. + +### Request/response infrastructure + +The difference begins with the LoopBack application object itself. In LoopBack +3, it is an instance of an Express application; in LoopBack 4, it is not. +Although LoopBack 4 uses Express as the HTTP server, it is not directly exposed +anymore. + +In LoopBack 3, Express middleware and routers, models, components, boot scripts, +and remote methods are the ways endpoints can be created on the application. +Let's take a look at how they have changed and how their functionality can be +migrated in LoopBack 4. + +#### Express middleware and routers + +In LoopBack 3 you could add routes and load custom middleware using `app.get()`, +`app.post()`, `app.use()`, etc., just like how you do in Express. In LoopBack 4, +you cannot do it yet. However, you can +[mount a LoopBack 4 application](./express-with-lb4-rest-tutorial.md) on an +Express application, which would allow you to still use the familiar routing +methods. + +{% include tip.html content="Follow our GitHub issues +[#1293](https://github.com/strongloop/loopback-next/issues/1293) +and +[#2035](https://github.com/strongloop/loopback-next/issues/2035) +to track the progress on supporting Express middlweware in LoopBack 4." %} + +If you want to mount an Express router in a LoopBack 4 application, you can use +the +[RestApplication.mountExpressRouter()](./apidocs/apidocs.rest.restapplication.mountexpressrouter.md) +API. + +Using [Controllers](./Controllers.md) is the recommended way for creating custom +(and REST) endpoints on your application. Its support for +[dependency injection](./Dependency-injection.md) and +[Interceptors](./Interceptors.md) makes it a very powerful extension mechanism. + +In LoopBack 4 +[middleware.json](https://loopback.io/doc/en/lb3/middleware.json.html) is not +required anymore because of architectural changes. + +#### Models + +In LoopBack 3, models files automatically create the corresponding REST API +endpoints and the database query machinery (using the configured datasource). In +LoopBack 4, model files are limited only to describing the properties of the +data. You will have to create a corresponding [Repository](./Repositories.md) +for database connectivity, and [controllers](./Controllers.md) for creating the +REST API endpoint. + +The fact that you have to create two more artifacts along with the model to get +a REST endpoint working might seem overly tedious at first. However, the +separation of concerns and decoupling the functionality makes the codebase +cleaner, easier to maintain, and much easier to customize functionality at +various levels. This can be better appreciated as the complexity of your +application grows. + +For those who are uncomfortable with the concept of having to creating a +repository and a controller for a model, we have a component +[@loopback/rest-crud](./Creating-crud-rest-apis.md) ; with a little bit of +configuration, a model file is all you will need to create the REST endpoints. +Once your requirements outgrow what `@loopback/rest-crud` provides, you can +implement your REST endpoints the idiomatic way. + +#### Components + +Components are still supported in LoopBack 4, but the concept of component has +completely changed. + +In LoopBack 3, a +[component](https://loopback.io/doc/en/lb3/LoopBack-components.html) is a simple +Node.js module which exports a function with the signature +`function(app, options)`. In LoopBack 4, a [component](./Creating-components.md) +is a TypeScript class which can add [servers](./Server.md), +[observers](./Life-cycle.md), [providers](./Creating-components.md#providers), +and [controllers](./Controllers.md) to the application using dependency +injection. + +LoopBack 3 components adding routes can be migrated to LoopBack 4 by moving the +functionality to the controller of a LoopBack 4 component. + +Here is an example of migrating a LoopBack 3 routing component to a LoopBack 4 +component's controller. + +{% include code-caption.html content="server/hi-component.js" %} + +```js +module.exports = (app, options) => { + app.get('/hi', (req, res) => { + res.send('Hi!'); + }); +}; +``` + +{% include code-caption.html content="src/components/hi.component.ts" %} + +```ts +import {get} from '@loopback/rest'; +import {Component} from '@loopback/core'; + +export class HiController { + @get('/hi', { + responses: { + '200': { + content: {'application/json': {schema: {type: 'string'}}}, + }, + }, + }) + hello(): string { + return 'Hi!'; + } +} + +export class HiComponent implements Component { + controllers = [HiController]; +} +``` + +{% include code-caption.html content="src/application.ts" %} + +```ts +import { HiComponent} from './components/hi.component'; +... +export class Lb4AppApplication extends BootMixin( + ServiceMixin(RepositoryMixin(RestApplication)), +) { + constructor(options: ApplicationConfig = {}) { + ... + this.component(HiComponent); + ... + } +} +``` + +Because of the architectural changes, `component-config.json` is not required in +LoopBack 4 anymore. + +#### Boot scripts + +If you used LoopBack 3 boot scripts for adding routes to the application, it +should now be moved to a standalone controller, a component, or implemented +using `app.mountExpressRouter()`. + +Here is an example of migrating a route added by a boot script to a controller. + +{% include code-caption.html content="server/boot/hello.js" %} + +```js +module.exports = function (server) { + server.get('/hello', (req, res) => { + res.send('Hello!'); + }); +}; +``` + +{% include code-caption.html content="src/controllers/hello.ts" %} + +```ts +import {get} from '@loopback/rest'; + +export class HelloController { + @get('/hello') + hello(): string { + return 'Hello!'; + } +} +``` + +{% include tip.html content="For details about migrating LoopBack 3 boot scripts +refer to +[Migrating boot scripts](./migration-boot-scripts.md) +." %} + +#### Remote methods + +[Remote methods](https://loopback.io/doc/en/lb3/Remote-methods.html) add custom +endpoints to a model's REST interface. + +{% include code-caption.html content="server/models/person.js" %} + +```js +module.exports = function (Person) { + Person.greet = function (message, cb) { + cb(null, 'Greetings: ' + message); + }; + + Person.remoteMethod('greet', { + accepts: {arg: 'message', type: 'string'}, + returns: {arg: 'message', type: 'string'}, + }); +}; +``` + +The above remote method's functionality can be migrated to a controller in +LoopBack 4 in the following manner. + +{% include code-caption.html content="src/controllers/person.ts" %} + +```ts +import {post, requestBody} from '@loopback/rest'; + +export type Greeting = { + message: string; +}; + +const spec = { + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + message: { + type: 'string', + }, + }, + }, + }, + }, +}; + +export class PersonController { + @post('/person/greet', { + responses: { + '200': spec, + }, + }) + greet(@requestBody(spec) greeting: Greeting): string { + return 'Greetings: ' + greeting.message; + } +} +``` + +### Request/response pathway + +The request/response architecture has undergone a drastic change in LoopBack 4. +LoopBack 3's +[phase-based middleware routing system](https://loopback.io/doc/en/lb3/Routing.html) +is now replaced by a +[sequence handler](./apidocs/apidocs.rest.defaultsequence.md) that sits infront +of a [routing table](./apidocs/apidocs.rest.routingtable.md). + +In LoopBack 3, middleware are added using Express APIs and via phases in +`middleware.json` or using +[app.middleware()](https://apidocs.loopback.io/loopback/#app-middleware). +Request to the app passes through the middleware chain in the following order. + +- `initial:before` +- `initial` +- `initial:after` +- `session:before` +- `session` +- `session:after` +- `auth:before` +- `auth` +- `auth:after` +- `parse:before` +- `parse` +- `parse:after` +- `routes:before` +- [Express middleware](http://expressjs.com/guide/writing-middleware.html) +- [Components](https://loopback.io/doc/en/lb3/LoopBack-components.html) +- [Boot scripts](https://loopback.io/doc/en/lb3/Defining-boot-scripts.html) +- `routes` +- `routes:after` +- `files:before` +- `files` +- `files:after` +- `final:before` +- `final` +- `final:after` + +Any middleware higher up in the chain may terminate the request by sending a +response back to the client. + +![LoopBack 3 request/response components](./imgs/lb3-req-res.png) + +The REST API middleware is added in the `routes` phase and error handlers in the +`final` and `final:after` phases. + +The REST API middleware is responsible for creating REST API endpoints out of +the models in the application. It then uses the configured datasource for +connecting and querying the undelying database for the corresponding REST +requests. + +In LoopBack 4, the [sequence](./Sequence.md) is the gatekeeper of all requests +to the application. Every request to the application must pass through the +sequence. It identifies the responsible handler for the requested endpoint and +passes on the request to the handler. + +![LoopBack 4 request/response components](./imgs/lb4-req-res.png) + +Unlike LoopBack 3, models in LoopBack 4 do not create REST endpoints. Use the +`lb4 controller` command to quickly generate the REST endpoints for a model. + +For more details, refer to the LoopBack 4 +[request/response cycle](./Request-response-cycle.md) doc. + +#### Access to the request/response object + +Since LoopBack 3 uses the Express middleware pattern, the request and response +objects can always be accessed in all the middleware functions. + +In LoopBack 4, the request and response objects can be accessed in routers +loaded using the +[app.mountExpressRouter() ](./apidocs/apidocs.rest.restapplication.mountexpressrouter.md) +method, using the familiar Express middleware signature. + +[Controllers](./Controllers.md), [services](./Services.md), and +[repositories](./Repositories.md) are LoopBack 4 artifacts that participate in +the request/response cycle. The request and response objects can be made +available to them via [dependency injection](./Dependency-injection.md). + +Example of accesssing the request and response object in a Controller: + +```ts +import {inject} from '@loopback/context'; +import {Request, Response, RestBindings, get} from '@loopback/rest'; + +export class ExampleController { + constructor( + @inject(RestBindings.Http.REQUEST) private req: Request, + @inject(RestBindings.Http.RESPONSE) private res: Response, + ) {} + + @get('/headers') + headers() { + // Sends back the request headers + this.res.send(this.req.headers); + } +} +``` + +Similarly, the request and response objects can be injected into services and +respositories along with other objects from the [context](./Context.md). + +It may be tempting to use an Express router (because of familiarity) instead of +a controller to add custom endpoints to the application, but bear it in mind +that controllers are way more powerful and capable than Express routers because +of the following reasons: + +1. Support for dependency injection +2. Access to the application context +3. In-built support for parsing and validating submitted data based on the + endpoint's OpenAPI spec +4. Controller routes are included in the auto-generated OpenAPI spec document + +[Interceptors](./Interceptors.md) can intercept execution of controller methods, +thus have access to the request and response objects. + +#### Data coercion and validation + +{% include note.html content="For a detailed explanation about validation in +LoopBack 4, refer to the +[validation doc](./Validation.md)." %} + +[strong-remoting](https://github.com/strongloop/strong-remoting) is the core of +data coercion and validation in LoopBack 3. Validation rules are defined using +the `accepts` metadata and data-access level validation are defined by model +validation methods like `validatesPresenceOf()`. + +`strong-remoting`'s supported data types can be found in its +[type definitions](https://github.com/strongloop/strong-remoting/tree/master/lib/types), +each type comes with a validation and coercion methods. While the validations +are minimal (e.g. object properties are not validated), the coercions are very +comprehensive and applies different rules for values coming from JSON +(implemented by `fromTypeValue`) or from string sources like the url query and +HTTP headers. + +LoopBack 4 does a full JSON Schema validation at the REST layer and +property-based validation at the data-access layer. + +OpenAPI is used to describe the type and constraints of request parameters in +LoopBack 4. In a typical controller, OpenAPI schemas describing the model data +are built from the metadata provided by LoopBack Models. Non-model parameters +(e.g. id in `findById(id)`, `filter` in `find(filter)`) are described using +inline schema. + +When a request arrives, a light weight +[coercion](https://github.com/strongloop/loopback-next/blob/master/packages/rest/src/coercion/coerce-parameter.ts) +and +[validation](https://github.com/strongloop/loopback-next/blob/master/packages/rest/src/coercion/validator.ts) +is performed on the request body at OpenAPI parameters level. Then, the OpenAPI +schema is converted to JSON schema on which +[AJV validation](https://github.com/strongloop/loopback-next/tree/master/packages/rest/src/validation) +is run against the schema. + +Currently, LoopBack 4 does not validate non-body parameters against schema. It +will be supported in future, follow +[loopback-next#1573](https://github.com/strongloop/loopback-next/issues/1573) to +keep track of the progress. + +In LoopBack 4, it is possible to apply additional validation of model data at +the REST layer via `jsonSchema` model setting, which can partially replace +advanced validations provided by LoopBack 3 at data-access level. However, it is +not a direct replacement for Model validation methods in LoopBack 3. The former +performs the validation at the REST API layer, while the later performs the +validation at the data access layer; that means, the data validation of +`jsonSchema` will not be applied if data is modified using repository methods. + +Here is an example of enforcing the string length of a model property using +`jsonSchema` in LoopBack 4: + +```ts +export class Book extends Entity { + ... + @property({ + type: 'string', + jsonSchema: { + 'minLength': 5, + 'maxLength': 25 + } + }) + title: string; + ... +} +``` + +If the length of `title` is less than 5 characters, or is more than 25 +characters a 422 error will be thrown by the server. + +LoopBack 4 does not yet offer advanced validation rules at data-access layer +like LoopBack 3 does, +[we are working on it](https://github.com/strongloop/loopback-next/issues/1872). + +#### Access to data before writing to the databases + +In LoopBack 3, the `before save` +[operation hook](https://loopback.io/doc/en/lb3/Operation-hooks.html) enable +users to access the model data before it is written to the database. A similar +functionality can be achieved in LoopBack 4 by overriding the `create()` method +of the +[default CRUD repository](./apidocs/apidocs.repository.defaultcrudrepository.md) +in the repository of the model. + +Example of accessing model data before saving in LoopBack 3, using the +`before save` operation hook: + +```js +Book.observe('before save', async ctx => { + if (!ctx.instance.author) { + ctx.instance.author = 'Anonymous'; + } +}); +``` + +Example of accessing model data before saving in LoopBack 4, by overriding the +`create()` method of the model's repository. + +```ts +async create(book: Book, options?: Options): Promise { + if (!book.author) { + book.author = 'Anonymous'; + } + return super.create(book, options); +} +``` + +Similarly, various other repository methods in LoopBack 4 can be overriden to +access the model data in the context of their operation. + +{% include tip.html content=" +[Interceptors](./Interceptors.md) +may also be used to access the user submitted data in some cases." %} + +## Summary + +The phase-based middleware chain of LoopBack 3 is replaced by the sequence class +in LoopBack 4. Controllers, services, and respositories are part of the +request/response cycle in LoopBack 4; they provide interfaces and points of +access to the request object, the response object, and the model data. diff --git a/docs/site/imgs/lb3-req-res.png b/docs/site/imgs/lb3-req-res.png new file mode 100644 index 0000000000000000000000000000000000000000..0acf6902dc12c294ca540b365c6baa90be48e2b9 GIT binary patch literal 26675 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 literal 0 HcmV?d00001 diff --git a/docs/site/imgs/lb4-req-res.png b/docs/site/imgs/lb4-req-res.png new file mode 100644 index 0000000000000000000000000000000000000000..36ce6904fa87d99e5fd8975d882c9e61dae79d34 GIT binary patch literal 27605 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%0D1_7fMVtvPpob=+*$oaLLTe9LGcG#*YFCFG! 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 literal 0 HcmV?d00001 diff --git a/docs/site/sidebars/lb4_sidebar.yml b/docs/site/sidebars/lb4_sidebar.yml index 23e747d88537..cb84ceb8ae7c 100644 --- a/docs/site/sidebars/lb4_sidebar.yml +++ b/docs/site/sidebars/lb4_sidebar.yml @@ -810,6 +810,10 @@ children: url: Understanding-the-differences.html output: 'web, pdf' + - title: 'Request/response cycle' + url: LB3-vs-LB4-request-response-cycle.html + output: 'web, pdf' + - title: 'Mounting a LoopBack 3 application' url: migration-mounting-lb3app.html output: 'web, pdf'