Adonis v5를 사용하여 REST API 생성

In this multi-part tutorial, we'll create and deploy a multi-server architecture web application.

Part 1:
Part 2:
Part 3: Creating a REST API using Adonis v5
Part 4:
Part 5:


사용된 프레임 및 도구

  • 프런트엔드: NuxtJSTailwindCSS/UI
  • 백엔드: AdonisJS
  • 데이터베이스: PostgreSQL
  • 서버 제공 및 배포: Cleavr
  • 섹션 3 - Adonis v5 및 PostgreSQL을 사용하여 REST API 생성


    Adonis를 자세히 살펴보고 RESTAPI를 만듭니다.이를 위해서는 데이터 모델, 루트, 컨트롤러를 만들어야 한다.우리는 데이터베이스 테이블의 이동을 설정하고 데이터베이스 피드를 위한 피드를 만들 것입니다.

    RESTful API 라우팅 설정


    Adonis를 사용하면 표준 CRUD 작업을 쉽게 수행할 수 있으므로 모든 내용을 직접 정의할 필요가 없습니다.Route.resource()를 사용하면 모든 일반적인 때 경로가 자동으로 설정됩니다.다음 경로를 추가합니다.
    Route
      .resource('movies', 'MoviesController')
      .only(['index', 'show'])
      .apiOnly()
    
    이렇게 하는 목적은 /movies CRUD 루트를 설정하고 인용 MoviesController 으로 지정하는 것입니다. 나중에 정의하겠습니다.
    그러나 저는 간단한 응용 프로그램을 만들고 모든 영화나 단일 영화를 얻는 데만 흥미를 가지고 있기 때문에 .only()indexshow 경로만 포함합니다.
    우리는 또한 .apiOnly() 을 추가할 것이다.그렇지 않으면 .resource() 양식 라우팅이 생성됩니다.필요 없어요.
    터미널에서 다음 명령을 실행하여 indexshow 라우트만 생성되었는지 확인합니다.
    node ace list:routes
    

    데이터 모델 클래스 만들기


    새 모델을 생성하려면 다음 명령을 사용합니다.
    node ace make:model Movie
    
    이 작업은 /app/Models/Movie.ts 에서 새 파일을 만들어서 모델을 만드는 데 앞장서는 시작을 제공합니다.
    프런트엔드에 필요한 데이터 포인트를 검토하여 다음과 같이 영화의 모델 클래스를 정의합니다.
    import { DateTime } from 'luxon'
    import { BaseModel, column } from '@ioc:Adonis/Lucid/Orm'
    
    export default class Movie extends BaseModel {
      @column({ isPrimary: true })
      public id: number
    
      @column()
      public title: String
    
      @column()
      public posterImage: String
    
      @column()
      public releaseYear: Number
    
      @column()
      public topBilled: String
    
      @column()
      public genres: String
    
      @column()
      public movieDescription: String
    
      @column()
      public movieReview: String
    
      @column.dateTime({ autoCreate: true })
      public createdAt: DateTime
    
      @column.dateTime({ autoCreate: true, autoUpdate: true })
      public updatedAt: DateTime
    }
    

    데이터 마이그레이션 및 데이터베이스 마이그레이션


    다음 명령을 실행하여 새 마이그레이션을 만듭니다.
    node ace make:migration movies
    
    그러면 /database/migrations/<timestamp>_movies.ts 에 있는 파일이 생성됩니다.
    마이그레이션 파일로 이동하여 테이블 열에 추가합니다.
    import BaseSchema from '@ioc:Adonis/Lucid/Schema'
    
    export default class Movies extends BaseSchema {
      protected tableName = 'movies'
    
      public async up () {
        this.schema.createTable(this.tableName, (table) => {
          table.increments('id')
          table.timestamps(true)
          table.string('title').notNullable()
          table.string('poster_image').notNullable()
          table.string('release_year').notNullable()
          table.string('top_billed').notNullable()
          table.string('genres').notNullable()
          table.string('movie_description').notNullable()
          table.string('movie_review').notNullable()
        })
      }
    
      public async down () {
        this.schema.dropTable(this.tableName)
      }
    }
    
    다음 명령을 실행하여 데이터베이스를 마이그레이션하는 시간:
    node ace migration:run
    
    데이터베이스를 자세히 검사해서 테이블이 성공적으로 이전되었는지 봅시다.
    나는 TablePlus로 나의 데이터베이스를 관리하는 것을 좋아한다.따라서 이동행이 adonis_schema 테이블에 추가되었는지, 그리고 내 영화표와 열이 정확하게 이동되었는지 확인하기 위해 열 것입니다.화목하다녀석들 괜찮아 보여!🎉

    파종기를 제작하여 데이터베이스에 파종하다


    이제 우리는 데이터베이스에 우리가 전단을 제작할 때 확정한 예시 영화인 《남자의 아이》, 《종결자》, 《긴 바지의 자매애》를 파종할 파종기를 세울 것이다.
    node ace make:seeder Movies
    
    위의 명령은 databases/seeders/Movies.ts 에서 새 파종기 파일을 출력합니다.Movie 데이터 모델을 가져와서 데이터베이스에 파종하고 싶은 영화 세 세트의 디테일에 JSON을 추가합니다.
    import BaseSeeder from '@ioc:Adonis/Lucid/Seeder'
    import Movie from "App/Models/Movie";
    
    export default class MovieSeeder extends BaseSeeder {
      public async run () {
        await Movie.createMany([
          {
            title: 'Children of Men',
            posterImage: 'https://m.media-amazon.com/images/M/MV5BMTQ5NTI2NTI4NF5BMl5BanBnXkFtZTcwNjk2NDA2OQ@@._V1_.jpg',
            releaseYear: 2006,
            topBilled: 'Clive Owen, Julianne Moore, Michael Cane',
            genres: 'Adventure, Drama, Sci-Fi',
            movieDescription: 'In 2027, in a chaotic world in which women have become somehow infertile, a former activist agrees to help transport a miraculously pregnant woman to a sanctuary at sea.',
            movieReview: 'The movie is pretty good. It\'s known for long, seemingly un-cut sequences. It\'s better than Gravity. It\'s not as good as Galaxy Quest. You should watch it. I mean, what else are you doing?'
          },
          {
            title: 'The Terminator',
            posterImage: 'https://m.media-amazon.com/images/M/MV5BYTViNzMxZjEtZGEwNy00MDNiLWIzNGQtZDY2MjQ1OWViZjFmXkEyXkFqcGdeQXVyNzkwMjQ5NzM@._V1_SY1000_CR0,0,666,1000_AL_.jpg',
            releaseYear: 1984,
            topBilled: 'Arnold Schwarzenegger, Michael Biehn, Linda Hamilton',
            genres: 'Action, Sci-Fi',
            movieDescription: 'A human soldier is sent from 2029 to 1984 to stop an almost indestructible cyborg killing machine, sent from the same year, which has been programmed to execute a young woman whose unborn son is the key to humanity\'s future salvation.',
            movieReview: 'Like most movies that turn into a series, the 2nd one is wayyyyy better. In this movie, Schwarzenegger is the bad guy. The great thing for him, is that he\'s not required to act and just plays his normal self. Hollywood. A wonderland!'
          },
          {
            title: 'The Sisterhood of the Traveling Pants',
            posterImage: 'https://m.media-amazon.com/images/M/MV5BNmRjYWE3OTQtYzEwOC00OWM4LTk3MzktZTUyZTgzNjY4NDc0L2ltYWdlL2ltYWdlXkEyXkFqcGdeQXVyMTQxNzMzNDI@._V1_UX182_CR0,0,182,268_AL_.jpg',
            releaseYear: 2005,
            topBilled: 'Amber Tamblyn, Alexis Bledel, America Ferrera, Blake Lively',
            genres: 'Comedy, Drama, Romance',
            movieDescription: 'Four best girlfriends hatch a plan to stay connected with one another as their lives start off in different directions: they pass around a pair of secondhand jeans that fits each of their bodies perfectly.',
            movieReview: 'This movie is about the greatest miracle the world has seen. The pants fit them all! Furthermore, the pants travel all over the world. They\'re like a traveling gnome. But, more fun to watch!'
          },
        ])
      }
    }
    
    이제 데이터베이스에 대한 피드를 설정하려면 다음을 실행하십시오.
    node ace db:seed
    
    이 단계에서, 나는seed 명령을 성공적으로 실행하기 전에 설치할 것을 요구받았다 luxon.다음 프로그램을 실행하여 이 패키지를 설치할 수 있습니다.
    npm install --save luxon
    
    seed 명령을 성공적으로 실행한 후 데이터베이스 관리 클라이언트로 돌아가 데이터가 정확하게 파종되었는지 확인합니다.

    컨트롤러 클래스 생성


    컨트롤러 클래스를 만들 때가 됐어요!
    node ace make:controller MoviesController
    
    컨트롤러 파일은 app/Controllers/Http/MoviesController.ts 에 생성됩니다.
    새 파일로 이동하면 영화 모델을 추가하기 시작합니다.
    import Movie from "App/Models/Movie"
    
    다음은 색인 함수를 추가합니다.
    export default class MoviesController {
    
      public async index () {
        const movies = await Movie.all()
        return movies
      }
    }
    
    
    .all() 방법은 영화 테이블에 있는 모든 내용을 조회하고 되돌려주는 간략한 방법이다.
    이 경로는 영화 목록이 표시되는 홈 페이지에서 사용됩니다.
    현재, 우리의 상세한 정보 페이지에 대해, 우리는 단지 한 영화의 데이터를 되돌려 주고 싶을 뿐이다.MovieController 클래스에 다음을 추가합니다.
    public async show ({ params }) {
        const movie = await Movie.find(params.id)
        return movie
      }
    
    우리는 params.id 함수에서 .find를 전송하고 요청 URL에서 영화 id를 추출한 다음에 되돌아오는 id를 사용하여 데이터베이스에서 영화를 찾습니다.
    우리는 현재 이미 모든 루트와 컨트롤러를 정의했다.API 테스트할 때가 됐어요!😎

    테스트 API


    API 테스트를 위해 사용Postman;그러나 API 클라이언트를 사용하지 않으려면 가장 좋아하는 웹 브라우저를 사용할 수 있습니다.
    Postman에서 로컬 주소를 요청하고 URL 뒤에 Get 를 추가합니다.
    이 요청은 /movies 공유기를 터치한 다음 index 에 정의된 전체 영화 목록으로 돌아갑니다.

    얘가 작용했어!
    이제 영화 id를 전달했는지 확인하여 이 영화의 데이터만 되돌려줍니다.

    성공🔥
    우리는 이제 API를 준비했고, API의 데이터를 동적으로 호출하여 넣을 수 있도록 전단을 업데이트할 것입니다.
    다음은요?https://github.com/armgitaar/moviesapi를 클릭하여 GitHub의 2부 진행 상황을 확인합니다.

    좋은 웹페이지 즐겨찾기