---
title: "NestJs với prisma restapi"
description: "Tạo một ứng dụng nest mới Cài đặt Nodejs Kiểm tra phiên bản nodejs hiện tại λ node -v v16.13.0 Nếu mấy chưa cài NodeJs thì có thể vào trang chủ nodejs và downlo"
date: "2022-02-07"
author:
  name: "Nguyen Pham"
  role: "Xin chào. Mình thích lập trình và công nghệ. Đây là blog mình chia sẻ lại các kiến thức về lập trình, công nghệ."
  avatar: "http://0.gravatar.com/avatar/6fb61398e24046b34e13870dd6c357b9?s=128&d=mm&r=g"
category: "Programming"
tags: ["Programming", "api", "nestjs", "prisma", "rest-api"]
coverImage: "/blog/covers/nestjs-voi-prisma-restapi.png"
featured: false
readingTime: "3 min read"
---

# Tạo một ứng dụng nest mới

## Cài đặt Nodejs

Kiểm tra phiên bản nodejs hiện tại

```
λ node -v
v16.13.0
```

Nếu mấy chưa cài NodeJs thì có thể vào [trang chủ nodejs](https://nodejs.org/en/) và download về. Nên chọn bản LTS để ổn định hơn

## Cài đặt NestJs/CLI

Cài đặt nestjs/cli bằng npm

```
npm install -g @nestjs/cli
```

## Tạo một nest application mới

cú pháp `nest new tên_project`

Lưu ý:

Khi nó hiện câu hỏi `Which package manager would you ❤️ to use?`

thì hãy chọn `npm`

Với yarm mình chưa thử nhưng pnpm thì khi dùng với prisma sẽ lỗi nên cứ chọn npm

```
nest new nest-prisma-tutorial
```

# Cài đặt prisma

Cài đặt prisma package

```
npm install prisma --save-dev
```

Khởi tạo prisma

```
npx prisma init
```

![](https://s3.us-west-2.amazonaws.com/secure.notion-static.com/2ceb50dd-33c1-45e3-8817-12705fad858e/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20220207%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20220207T081138Z&X-Amz-Expires=86400&X-Amz-Signature=040468d8ffd3c3d86aa93a4a98757856b634a4dcd2f0aed1c427609b049ad4d2&X-Amz-SignedHeaders=host&response-content-disposition=filename%20%3D%22Untitled.png%22&x-id=GetObject)

## Cấu hình database

`schema.prisma`

File này sẽ chứa các `model`

`datasource`

Cái này để kết nối với csdl

`provider` Loại cơ sở dữ liệu muốn kết nối

`url` Đường dẫn csdl (Lấy từ file `env`)

`env`

```
DATABASE_URL="file:./db.sqlite"
```

```
// This is your Prisma schema file,
// learn more about it in the docs: <https://pris.ly/d/prisma-schema>

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "sqlite"
  url      = env("DATABASE_URL")
}
```

Như vậy chúng ta đã hoàn thành kết nối prisma với csdl

## Viết model

Chúng ta sẽ định nghĩa model ở trong file `schema.prisma`

Đây là model có tên là `Task`

gồm thuộc tính:

- id: tự động tăng
- title: chuỗi
- comleted: boolean

```
model Task {
  id        Int @id @default(autoincrement())
  title     String
  completed Boolean
}
```

# Tạo nest module mới

Tạo module task

Module này sẽ tự import vào app.module.ts

```
nest g module task
```

Tạo controller task

controller sẽ được import vào task.module.ts

⇒ Xử lý các request từ người dùng

```
nest g comtroller task
```

Tạo service task

service sẽ được import vào task.module.ts

⇒ Viết các thao tác xử lý với cơ sở dữ liệu

```
nest g service task
```

## Viết task service

```
import { Injectable, ParseIntPipe } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();
@Injectable()
export class TaskService {
  create(title, completed) {
    prisma.task.create({
      data: {
        title: title,
        completed: completed ? true:false,
      },
    }).then(res=>{
      return res
    });
    // return 'create services';
  }
  get() {
    const dt = prisma.task.findMany({
      select:{
        title: true,
        completed: true
      }
    })
    return dt
  }
  getOne(id){
    const dt = prisma.task.findFirst({
      where:{
        id: id
      }
    })
    return dt
  }
}
```

## Viết task controller

Khởi tạo service

`constructor(private readonly taskService: TaskService) {}`

Sau khi khởi tạo ta có thể dùng các hàm trong service để xử lý

```
import { Body, Controller, Get, Param, ParseIntPipe, Post } from '@nestjs/common';
import { TaskService } from './task.service';

@Controller('task')
export class TaskController {
  constructor(private readonly taskService: TaskService) {}

  @Get()
  getTask() {
    return this.taskService.get();
  }
  @Get('/:id')
  getOne(@Param('id', ParseIntPipe) id:number) {
    return this.taskService.getOne(id);
  }

  @Post()
  createTask(@Body() body) {
    const { title, completed } = body;
    this.taskService.create(title, body);
    return 'Task is created';
  }
}
```

# Chạy và test thử

Chạy ta dùng lệnh

```
npm run start:dev
```
