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