【NodeJS】使用AWS Lambda+APIGateway+DynamoDB创建TODO应用程序

首先

由于对无服务器技术产生了兴趣,我开始自己学习使用AWS Lambda、APIGateway和DynamoDB来创建一个TODO应用程序。
作为个人备忘录,我将把服务器端和客户端的处理过程总结成一篇文章(目前仍在创建中)。

简要介绍

我們使用Lambda時使用的語言是Node。
DynamoDB只有兩個項目,分別是id和todo。
表格名稱為「todoTable」。
這次我們只實現GET和POST兩種方法。

使用Lambda创建函数。

虽然本来想把它们合并为一个函数,但是我不知道如何在Lambda中传递GET方法,所以暂时将函数分开了。

首先,从GET方法开始。
简单地获取所有列。(虽然原则上不宜频繁使用scan操作)

const AWS = require('aws-sdk')
const dynamo = new AWS.DynamoDB.DocumentClient()

exports.handler = (event, context, callback) => {
    const httpMethod = event.httpMethod
    const params = {
        'TableName': 'todoTable'
    }
    dynamo.scan(params, function (err, data) {
        const response = {
            statusCode: 200,
            body: JSON.stringify(data.Items)
        }
        callback(null, response)
    })
};

我們將在客戶端從請求的body中提取todoList並顯示它。

接下来是POST方法。

const AWS = require('aws-sdk')
const dynamo = new AWS.DynamoDB.DocumentClient()

exports.handler = (event, context, callback) => {
    const params = {
        'TableName': 'todoTable',
        'Item': {
            'id': event.id,
            'todo': event.todo
        }
    }
    dynamo.put(params, function(err, data) {
        if (err) {
            console.log('error')
        } else {
            console.log('success')
            const response = {
                statusCode: 200,
                body: JSON.stringify(data)
            }
            context.done(null, response)
        }
    })
};

这次为了简化起见,我们采用了这样的实现方式(之后会全部改成try-catch)。
不知道为什么在这里使用callback会被指责。
希望了解原因的人能告诉我。

请将这些功能分配给每个方法,在API网关上进行部署。具体细节不再赘述。

客户端

这次我们将不使用jQuery,而是使用XMLHttpRequest来实现。

首先,在屏幕加载时,使用GET方法获取表格的项目并进行显示。

window.onload = () => {
    const request = new XMLHttpRequest()

    request.open('GET', 'https://ほにゃらら.amazonaws.com/dev', true)
    request.responseType = 'json'

    request.onload = event => {
        const data = this.response
        const todoList = JSON.parse(data.body)
        for (task of todoList) {
            const item = task.todo
            // HTMLのulにliを突っ込むだけのメソッド
            createTodoList(item)
        }
    }

    request.send()
}

没有特别困难的部分。

接下来,添加在添加TODO时触发的事件。

// addというinputタグにイベントを追加
const addTask = document.querySelector('.add')
addTask.addEventListener('submit', e => {
    e.preventDefault()

    const id = Math.random().toString(36).slice(-8);
    const task = addTask.add.value.trim()
    const item = {
        'id': id,
        'todo': task
    }

    const request = new XMLHttpRequest()
    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功能,并将它们整合到一个函数中。
完成这个之后,也许我会尝试做一个应用程序。

广告
将在 10 秒后关闭
bannerAds