自分の環境
・Windows10
・Docker
・Docker-composer
・Node.js 10.15.3
やりたいこと
DockercomposerでPostgresとExpressを使用して、ローカル環境にAPIサーバーを作る。
とりあえず、Docker-Composer書く
docker-composer.yaml
version:'3.7'services:api:image:'node:12-alpine'volumes:-'./:/api:cached'working_dir:'/api'environment:HOST:'0.0.0.0'ports:-'3000:3000'command:'sh-c"npminstall&&npmrunstart"'db:image:postgres:12-alpinerestart:alwaysenvironment:POSTGRES_PASSWORD:postgresPOSTGRES_USER:postgresPOSTGRES_DB:postgresDATABASE_HOST:localhostports:-"5432:5432"volumes:-./migration:/docker-entrypoint-initdb.d
npmで必要なものをいろいろ入れる
・Express
・pg
npm init
npm install Express pg
とりあえず、ローカルでExpressが上手く動いているか確認する
node index.js
localhost:3000にアクセスする。Hello World!って表示されたらOK!
Expressのルーティングをいじってみる
index.js
constexpress=require('express')constapp=express()app.get('/',(req,res)=>res.send('Hello World!'))app.get('/user',(req,res)=>res.send('Got a PUT request at /user'));app.get('/hoge',(req,res)=>res.send('ほげほげ'));app.listen(3000,()=>console.log('Example app listening on port 3000!'))
localhost:3000/userにアクセスしてみて、Got a Put~って書いてあればOK。
他にもルーティングを足したい時はhogeのように足していく。
ExpressとPostgreSQLを接続させる
index.js
constexpress=require('express')constapp=express()const{Pool,Client}=require('pg')constconnectionString='postgres://postgres:postgres@db:5432/postgres'constpool=newPool({connectionString:connectionString,})pool.query('SELECT NOW()',(err,res)=>{console.log(err,res)pool.end()})app.get('/',(req,res)=>res.send('Hello World!'))app.get('/user',(req,res)=>res.send('Got a PUT request at /user'));app.listen(3000,()=>console.log('Example app listening on port 3000!'))
ログでSELECT NOW()のクエリの結果が表示されていればOK!
マイグレーション用のSQLを作成する
今のままだと、DBに何も入っていないので、テーブル作成用のSQLを作成し、Docker-compose up時に自動でSQL文を実行させるようにする。
/migration/migration.sql
CREATETABLECompany(idserial,nametextNOTNULL,descriptiontextNOTNULL,PRIMARYKEY(id));INSERTINTOresume(name,description)VALUES('株式会社〇〇''老舗のIT系の会社。人材派遣も行っている',),('△△株式会社''人材系の会社。自社開発は行っていない',),('株式会社✖✖''最近設立したばかりの伸び盛りのIT系ベンチャー企業',);
こんな感じで、ファイルを作成し、docker-compose upをすると、Companyテーブルとレコードが追加されます。
実際にレコードが追加されたことを確かめるために、index.jsを修正します。
index.js
constexpress=require('express')constapp=express()const{Pool,Client}=require('pg')constconnectionString='postgres://postgres:postgres@db:5432/postgres'constpool=newPool({connectionString:connectionString,})pool.query('SELECT NOW()',(err,res)=>{console.log(err,res)pool.end()})//idの箇所に数字を入れることで、パラメータを渡すことができる。company/10//みたいな感じで渡すと、10を受け取ることができる。//Laravelのルーティングの中に処理を書くイメージだと思われる。(本当はもっといい方法がありそう)// app.post('/company/:id',(req,res)=> // res.send(req.param('id') + ":POSTデータのお返しです!")// );/*
URL設計
/company⇒Companyの全件取得
/company/:id⇒Companyテーブルのidに応じたレコードの取得
*/app.get('/company',(req,res)=>{constclient=newClient({connectionString:connectionString,})client.connect()client.query('SELECT * FROM Company',(err,result)=>{res.send(result.rows);client.end()})});app.get('/company/:id',(req,res)=>{constclient=newClient({connectionString:connectionString,})client.connect()//idを使ってクエリclient.query({name:'fetch-user',text:'SELECT * FROM Company WHERE id = $1',values:[req.param('id')]},(err,result)=>{res.send(result.rows);client.end()})});app.listen(3000,()=>console.log('Example app listening on port 3000!'))
localhost:3000/companyでテーブルの中身が全件表示されて、
localhost:3000/company/1で「株式会社〇〇」のレコードが表示されていれば成功です。
ちなみに、app.getのところを、app.postにすることもできます。
こんな感じで、Dockerを使用してExpressとPostgreSQLでの
API開発環境の構築が出来ました!!!