前回は、サーバーレスオフラインで DynamoDB のデータを削除しました。

今回は、DynamoDB のデータを更新します。

まずは、更新するためのハンドラーを作成します。

api フォルダに、update-note.js を作成します。

create-note.js からコードを流用しましょう。

const AWS = require("aws-sdk")
AWS.config.update({ region: "us-west-2" })

const { v4: uuidv4 } = require("uuid")
const moment = require("moment")

const dynamodb = new AWS.DynamoDB.DocumentClient()
const tableName = process.env.NOTES_TABLE

exports.handler = async event => {
  try {
    let item = JSON.parse(event.body).Item
    item.user_id = event.headers.user_id
    item.user_name = event.headers.user_name
    item.note_id = uuidv4()
    item.timestamp = moment().unix()

    await dynamodb
      .put({
        TableName: tableName,
        Item: item,
      })
      .promise()

    return {
      statudCode: 200,
      headers: { "Access-Control-Allow-Origin": "*" },
      body: JSON.stringify(item),
    }
  } catch (err) {
    console.log("Error:", err)
    return {
      statusCode: err.statusCode ? err.statusCode : 500,
      headers: { "Access-Control-Allow-Origin": "*" },
      body: JSON.stringify({
        error: err.name ? err.name : "Exception",
        message: err.message ? err.message : "Unknown error",
      }),
    }
  }
}

item.note_iditem.timestampの部分は、必要ないので削除します。

uuidmomentのインポートも削除しましょう。

const AWS = require("aws-sdk")
AWS.config.update({ region: "us-west-2" })

const dynamodb = new AWS.DynamoDB.DocumentClient()
const tableName = process.env.NOTES_TABLE

exports.handler = async event => {
  try {
    let item = JSON.parse(event.body).Item
    item.user_id = event.headers.user_id
    item.user_name = event.headers.user_name

    await dynamodb
      .put({
        TableName: tableName,
        Item: item,
      })
      .promise()

    return {
      statudCode: 200,
      headers: { "Access-Control-Allow-Origin": "*" },
      body: JSON.stringify(item),
    }
  } catch (err) {
    console.log("Error:", err)
    return {
      statusCode: err.statusCode ? err.statusCode : 500,
      headers: { "Access-Control-Allow-Origin": "*" },
      body: JSON.stringify({
        error: err.name ? err.name : "Exception",
        message: err.message ? err.message : "Unknown error",
      }),
    }
  }
}

note_idと一致するデータの内容を更新するようにします。

dynamodbputに、条件付き書き込みを追加する場合、ConditionExpressionを設定します。

ConditionExpression#note_id = :note_idを指定します。

ExpressionAttributeNames#note_idの名前をnote_idへ置換します。

ExpressionAttributeValuesで条件付き書き込みの値を定義します。

await dynamodb
  .put({
    TableName: tableName,
    Item: item,
    ConditionExpression: "#note_id = :note_id",
    ExpressionAttributeNames: {
      "#note_id": "note_id",
    },
    ExpressionAttributeValues: {
      ":note_id": item.note_id,
    },
  })
  .promise()

ハンドラーの作成が完了したので、YAML を設定します。

serverless.yml を開きます。

functionsupdate-noteを作成します。

methodは、patchとします。

update-note:
  handler: api/update-note.handler
  description: PATCH /note
  events:
    - http:
        path: note
        method: patch
        cors:
          origin: "*"
          headers: ${self:custom.allowedHeaders}

一通り完成したので、テストしてみましょう。

ターミナルでプロジェクトのディレクトリに移動し、serverless offline を実行します。

ポストマンを開いて、URL と Headers を設定します。

メソッドは、PATCH としましょう。

image2

Body に更新を指定したいデータをデータ一覧からコピーします。

image3

PATCH メソッドの Body に貼り付けます。

この時、Item も指定するようにします。

また、title を更新したい内容に書き換えましょう。

image4

『Send』ボタンをクリックすると

image5

成功したようです。

試しにデータを取得してみると、

image6

データの title が更新されていました。

ブログ一覧