前回は、サーバーレスオフラインで DynamoDB に保存したデータを取得しました。

今回は、保存したデータから、単一データを取得します。

まずは、単一データを取得するためのハンドラーを作成します。

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

get-notes.js のコードを流用します。

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 = await dynamodb.query(params).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",
      }),
    }
  }
}

まずは、eventpathParametersからnote_idを取得します。

また、decodeURIComponentで、URI 形式になっている文字列をデコードしましょう。

exports.handler = async (event) => {
  try {
    let note_id = decodeURIComponent(event.pathParameters.note_id);

次に、paramsを設定します。

TableNameは、tableNameを指定します。

特定のデータを取得するために、IndexNameを設定します。

IndexNameは、serverless.yml のGlobalSecondaryIndexesで設定した、『note_id-index』を指定します。

KeyConditionExpressionは、note_id = :note_idを指定します。

ExpressionAttributeValuesの:note_idは、note_idを指定します。

単一データなので、Limitは、『1』とします。

exports.handler = async (event) => {
  try {
    let note_id = decodeURIComponent(event.pathParameters.note_id);

    let params = {
      TableName: tableName,
      IndexName: "note_id-index",
      KeyConditionExpression: "note_id = :note_id",
      ExpressionAttributeValues: {
        ":note_id": note_id,
      },
      Limit: 1,
    };

bodyitemを単一データにするために、item.Items[0]とします。

return {
  statudCode: 200,
  headers: { "Access-Control-Allow-Origin": "*" },
  body: JSON.stringify(item.Items[0]),
}

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

serverless.yml を開きます。

functionsget-noteを作成します。

pathを、note/{note_id}として、note_idを中括弧で囲むと、動的に変わる内容となります。

get-note:
  handler: api/get-note.handler
  description: GET /note
  events:
    - http:
        path: note/{note_id}
        method: get
        cors:
          origin: "*"
          headers: ${self:custom.allowedHeaders}

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

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

今回は、こちらの note_id を指定します。

image2

こちらの note_id を URL にします。

また、Headers を設定しておきましょう。

image3

『Send』をクリックすると、

image4

単一のデータを取得することができました。

次回は、DynamoDB のデータを削除します。

ブログ一覧