DynamoDB ORM dynamoose で REST API を作ってみた

2023/04/02に公開

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で以下を起動していただくのがおすすめです。(ソースには含まれてます。)

docker-compose.yml
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 設定

index.ts
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 の設定

index.ts
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(データ取得)

index.ts
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)

index.ts
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

ソース

test-dynamoose

Discussion