DynamoDB ORM dynamoose で REST API を作ってみた
dynamoose とは
Dynobase - Professional DynamoDB GUI Client
Node.js 用の DynamoDB ORM です。
DynamoDB は結構癖があるので、ORM でラップした方が使いやすいかなと思い試しに導入してみました。
dynamoose - npm 上で「keywords:dynamodb」で検索すると上から 4 番目ぐらいに出ています。
週間ダウンロード数が 81,031 で最終のメンテナンスが 7 か月前なのでうーんまぁ、、、ぐらいです。
ただ、Google で検索してもあまり日本語の記事は出てこないのでこれは公式サイト及び英語サイトから情報を入手する必要性が高いパッケージです。
ORM とは
脱線しますが ORM ご存じない方の為に少しだけ解説を挟んでおきます。
Wikipediaより抜粋。
オブジェクト関係マッピング(英: Object-relational mapping、O/RM、ORM)とは、
データベースとオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法である。
オブジェクト関連マッピングとも呼ぶ。実際には、オブジェクト指向言語から使える「仮想」オブジェクトデータベースを構築する手法である。
オブジェクト関係マッピングを行うソフトウェアパッケージは商用のものもフリーなものもあるが、場合によっては独自に開発することもある。
はい!日本語が難しいですが、簡単に言うと DB との接続周りをいい感じにプログラムで書けるようにして、その上 DB のテーブル周りもプログラムで書けるようにしますよ!
これで DB わからない人でもプログラムがわかれば使えるね!ってする為のものです。
DynamoDB がローカルにない人向け Docker
今回 DynamoDB ローカルを使うのでローカルに DynamoDB なんてもちろん入っている!という方以外はdocker-compose up -d
で以下を起動していただくのがおすすめです。(ソースには含まれてます。)
version: "3.8"
services:
dynamodb:
image: amazon/dynamodb-local
container_name: dynamodb
ports:
- 8000:8000
command: -jar DynamoDBLocal.jar -dbPath /data -sharedDb
volumes:
- $PWD/dynamodb/data:/data
dynamodb-admin:
container_name: dynamodb-admin
image: aaronshaf/dynamodb-admin:latest
environment:
- DYNAMO_ENDPOINT=dynamodb:8000
ports:
- 8001:8001
depends_on:
- dynamodb
少し解説すると
http://localhost:8000が DynamoDB Local の本体です。
http://localhost:8001が DynamoDB の GUI ツールです。
この Docker 構成は結構便利なので DynamoDB 周りの開発をローカルでするならおすすめです。
導入
インストール
npm install dynamoose
基本設定
DynamoDB 設定
import express from "express";
import bodyParser from "body-parser";
import dynamoose from "dynamoose";
// DyanmoDB設定
dynamoose.aws.sdk.config.update({
accessKeyId: "AKID",
secretAccessKey: "SECRET",
region: "us-east-1",
});
// ローカルDynamoDBに接続
dynamoose.aws.ddb.local();
Express の設定
const app: express.Express = express()
const port = 3000
// JSON使用設定
app.use(
bodyParser.urlencoded({
extended: true,
}),
)
app.use(bodyParser.json())
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
API 作成
Get API(データ取得)
app.get('/', (req, res, next) => {
const userId = 'a'
return Todo.query('userId')
.eq(userId)
.exec((err, result) => {
if (err) return next(err)
res.status(200).json(result)
})
})
データ登録(POST API)
app.post('/', (req, res, next) => {
const body = req.body
body.createdAt = new Date().toISOString()
body.updatedAt = new Date().toISOString()
body.userId = body ? body.userId : 'a'
return new Todo(body).save((err, result) => {
if (err) return next(err)
res.status(201).json(result)
})
})
動作確認
データ登録後にデータ取得を行ってください
1.データ登録
curl -X POST localhost:3000
2.データ取得
curl localhost:3000
Discussion