12/08/2018, 17:23 
               
            Xây dựng GraphQL server với Node.js
Ở bài này mình sẽ xây dựng GraphQL server với Node.js Sử dụng các công nghệ chính: Express, apollo server express. Database: Postgresql với Knex query. Mội vài thư viên Javascript khác : dataloader để giải quyết N+1, babel-node để sử dụng ES6 và nodemon để cập nhật server khi thay đổi code. ...
Ở bài này mình sẽ xây dựng GraphQL server với Node.js Sử dụng các công nghệ chính:
- Express, apollo server express.
 - Database: Postgresql với Knex query.
 - Mội vài thư viên Javascript khác : dataloader để giải quyết N+1, babel-node để sử dụng ES6 và nodemon để cập nhật server khi thay đổi code.
 - Docker for setup development.
 
Cấu trúc thư mục
Bao gồm các thư mục chính:
- bussiness: thực ra bạn có thể sử dụng Bookself ORM. Định nghĩa các đối tượng và các hàm để giao tiếp với database
 - knex.file.js, db (index.js, /migrations, /queryBuilders, /seeds): Dùng cho Knex.js để tương tác với database Postgresql
 - Dockerfile, docker-images/db/Dockerfile và docker-compose.yml: Các Dockerfile để xây dựng các images(các image tạo ra container để chạy service) và docker-compose để kết hợp các container với nhau thành 1 hệ thống.
 - config.env: Cài đặt các giá trị để cấu hình hệ thống. Rất quan trọng khi sử dụng trong các môi trường khác nhau (development, production)
 - presentation/schema: Định nghĩa schema (Type, Query, Mutation, resolvers) cho GraphQL
 
. ├── bussiness │ └── hero.js ├── config.env ├── db │ ├── index.js │ ├── migrations │ ├── queryBuilders │ └── seeds ├── docker-compose.yml ├── Dockerfile ├── docker_images │ └── db ├── index.js ├── knexfile.js ├── node_modules ├── package.json ├── presentation │ └── schema.js
Cài đặt môi trường phát triển với Docker
Mình sẽ cần Docker image cho Node.js
FROM node:9.8-alpine WORKDIR /usr/src/graph EXPOSE 3000 CMD ["yarn", "run", "serve"]
Và 1 image nữa cho database Postgresql
FROM postgres:9.6.3
Sau đó kết hợp với docker-compose.yml:
- Server Node với tên là graph sẽ chạy ở cổng 3000
 - Database Postgresql sẽ dùng cổng 5432
 - Dùng file config.env để config các giá trị cần thiết cho Postgresql:
 
POSTGRES_USER=heroesuser POSTGRES_PASSWORD=heroespassword POSTGRES_DB=heroesdb PGDATA=/data DB_HOST=db
Và đây là file docker-compose.yml
# docker-compose.yml
version: '3'
services:
  graph:
    build:
      context: .
    image: heroes-graph
    env_file: config.env
    volumes:
      - .:/usr/src/graph
    ports:
      - 3000:3000
    links:
      - db:db
  db:
    build:
      context: ./docker_images/db
    env_file: config.env
    image: heroes-db
    ports:
      - 5432:5432
Server Node với Express
Chúng ta đã cài đặt xong môi trường phát triển với Docker.
Để hệ thống này bạn chỉ cần chạy
docker-compose build và docker-compose up là xong.