Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8890

【NodeJS】AWS Lambda+APIGateway+DynamoDBでTODOアプリを作成

$
0
0

はじめに

サーバーレスを趣味で始めてみたので、勉強がてらAWS Lambda+APIGateway+DynamoDBでTODOアプリを作成し始めました。
個人のメモとして、サーバー側とクライアント側での処理を記事にまとめます。(まだ作成途中です)

概要

Lambdaで使用する言語はNode
DynamoDBはidとtodoという項目のみを持ちます。
テーブル名は「todoTable」
今回は、GETとPOSTのみを実装します。

Lambdaで関数作成

本来であれば1つの関数にまとめたかったのですが、GETメソッドであることをLambdaに渡す方法がわからず、ひとまず関数を分けました。

まずはGETメソッドから。
単純に全てのカラムを取得します。(本来はあまりscanは使わない方がいいらしいが)

constAWS=require('aws-sdk')constdynamo=newAWS.DynamoDB.DocumentClient()exports.handler=(event,context,callback)=>{consthttpMethod=event.httpMethodconstparams={'TableName':'todoTable'}dynamo.scan(params,function(err,data){constresponse={statusCode:200,body:JSON.stringify(data.Items)}callback(null,response)})};

クライアント側でbodyからtodoListを取り出し表示するようにします。

続いてPOSTメソッド。

constAWS=require('aws-sdk')constdynamo=newAWS.DynamoDB.DocumentClient()exports.handler=(event,context,callback)=>{constparams={'TableName':'todoTable','Item':{'id':event.id,'todo':event.todo}}dynamo.put(params,function(err,data){if(err){console.log('error')}else{console.log('success')constresponse={statusCode:200,body:JSON.stringify(data)}context.done(null,response)}})};

try-catchでやるべきですが、今回は簡略化のためこのような実装にしました。(あとで全てtyr-catchに直します)
なぜかここでcallbackを使うと怒られました。
理由分かる方、教えていただきたいです。

あとはAPIGatewayでこれらの関数を各メソッドに割り当てて、デプロイしてください。
詳細は省きます。

クライアントサイド

今回はjQueryは使わずにXMLHttpRequestを使用して実装します。

まずは、画面がロードされた際にGETメソッドでテーブルの項目を取得し、表示をします。

window.onload=()=>{constrequest=newXMLHttpRequest()request.open('GET','https://ほにゃらら.amazonaws.com/dev',true)request.responseType='json'request.onload=event=>{constdata=this.responseconsttodoList=JSON.parse(data.body)for(taskoftodoList){constitem=task.todo// HTMLのulにliを突っ込むだけのメソッドcreateTodoList(item)}}request.send()}

特に難しい部分はなし。

続いて、TODOを追加した際に走るイベントを追加。

// addというinputタグにイベントを追加constaddTask=document.querySelector('.add')addTask.addEventListener('submit',e=>{e.preventDefault()constid=Math.random().toString(36).slice(-8);consttask=addTask.add.value.trim()constitem={'id':id,'todo':task}constrequest=newXMLHttpRequest()request.open('POST','https://ほにゃらら.amazonaws.com/dev/insert',true)request.setRequestHeader('Content-Type','application/json');request.send(JSON.stringify(item))if(task.length){createTodoList(task)addTask.reset()}})

これで完成です。サーバーレスは短時間で割といろいろできて楽しいですね!

躓いたところ

CORS問題

Access-Control-Allow-Origin 

これを理由にずっと怒られていました。
↓参考記事
【解説付き】chromeでXMLHttpRequestをローカルのファイルで行う方法
AWS API Gateway クロスドメイン通信

XMLHttpRequestのパラメータの渡し方

現在のコード

request.send(JSON.stringify(item))

過去のコード(エラー発生)

request.send(item)

JSON形式にしておらず、30分くらい悩まされていました。。。

終わり

今後はUPDATE、DELETEの実装をし、全て1つの関数にまとめたいと思っています。
それが終わったらなんかしらアプリ作ってみようかな。


Viewing all articles
Browse latest Browse all 8890

Trending Articles