---
# System prepended metadata

title: Loopback tutorial

---

# Loopback tutorial

Chạy lệnh lb4 app và điền thông tin

Bỏ docker

Chạy lb4 model, tên Todo, thêm các field

id: string, bắt buộc, generate tự động
title: string, bắt buộc
description: string, không bắt buộc
isComplete: boolean, bắt buộc
deadline: date, không bắt buộc

Mở file todo.model.ts, thay đổi như sau:

```typescript
@model({
  settings: {
    mongodb: {
      collection: 'todo'
    }
  }
})

// phần id
mongodb: {
  dataType: 'ObjectId',
},

// những phần còn lại
mongodb: {
  fieldName: 'description'
}
```

Chạy lb4 datasource, đặt tên db
* host: 127.0.0.1
* port: 27017
* db: list-todos
* Feature support: Yes

Thêm useFindAndModify, useCreateIndex, useUnifiedTopology vào datasource

Chạy lb4 repository

Chạy lb4 controller, đặt tên todo, Yes ở ommitted

Chạy npm i express, npm i --save-dev @types/express

Thêm file server.ts vào ./src

Nội dung 1:
```typescript
import express from 'express';

export class ExpressServer {
  constructor() {
    
  }
}
```

Nội dung 2:
```typescript

import express from 'express';
import http from 'http';
import {ApplicationConfig, ListTodosApplication} from './application';

export {ApplicationConfig};

export class ExpressServer {
  public readonly app: express.Application;
  public readonly lbApp: ListTodosApplication;
  private server?: http.Server;

  constructor(options: ApplicationConfig) {
    this.app = express();
    this.lbApp = new ListTodosApplication(options);
  }
}
```

Thêm dòng này vào cuối constructor:
```typescript
this.app.use('/api', this.lbApp.requestHandler);
```

Chỉnh 2 dòng trong public/index.html

```htmlembedded
<h3>OpenAPI spec: <a href="/api/openapi.json">/openapi.json</a></h3>
<h3>API Explorer: <a href="/api/explorer">/explorer</a></h3>
```

??: Nullish Coalescing Operator

Nội dung 3
```typescript
async boot() {
  await this.lbApp.boot();
}

public async start() {
  await this.lbApp.start();
  const port = this.lbApp.restServer.config.port ?? 3000;
  const host = this.lbApp.restServer.config.host || '127.0.0.1';
  this.server = this.app.listen(port, host);
  await once(this.server, 'listening');
}
```

qua index.ts xóa chừa mỗi import dòng đầu, xóa ApplicationConfig trong dòng đầu

Thêm vào index.ts:
```typescript
export {ListTodosApplication, ApplicationConfig, ExpressServer};

export async function main(options: ApplicationConfig = {}) {
  const server = new ExpressServer(options);
  await server.boot();
  await server.start();
  console.log('Server is running!');
}

if (require.main === module) {
  const config = {
    rest: {
      port: process.env.PORT ?? 3000,
      host: process.env.HOST ?? 'localhost',
      listenOnStart: false,
    }
  };
  main(config)
  .catch(err => console.log(err));
}

```

Xử lý custom response từ controller:

Thêm vào RequestContext, RestBindings từ @loopback/rest, {inject} từ @loopback/core

Thêm vào constructor:
@inject(RestBindings.Http.RESPONSE)
private requestContext: RequestContext

lấy response: this.requestContext.response