现在您的 API 已上线,我们来测试一下吧。在测试其中一个终端节点之前,您将快速浏览一下代码的解释。
Web 应用程序使用 Express.js 构建,后者是一个热门的 Node.js Web 应用程序框架。在 AWS Lambda 上构建应用程序时,您不需要使用现有的 Web 框架(如 Express.js),但是如果您有使用 Express 的经验,那么学习过程会变得简单。
Express 应用程序的核心位于 application/app.js。在文件资源管理器中打开文件。
// application/app.js
const express = require('express')
const bodyParser = require('body-parser')
const { fetchUserScores, addUserScore, fetchTopScores } = require('./data')
const { createCognitoUser, login, verifyToken } = require('./auth')
const { validateCreateScore } = require('./validate')
const app = express()
app.use(bodyParser.json())
function wrapAsync(fn) {
return function(req, res, next) {
fn(req, res, next).catch(next);
};
}
// Login
app.post('/login', wrapAsync(async (req, res) => {
const idToken = await login(req.body.username, req.body.password)
res.json({ idToken })
}))
// Create user
app.post('/users', wrapAsync(async (req, res) => {
await createCognitoUser(req.body.username, req.body.password, req.body.email)
res.json({ username: req.body.username })
}))
// Fetch user scores
app.get('/users/:username', wrapAsync(async (req, res) => {
const limit = req.query.limit || 10;
const scores = await fetchUserScores(req.params.username, limit)
res.json(scores)
}))
// Add new score
app.post('/users/:username', wrapAsync(async (req, res) => {
const validated = validateCreateScore(req.body)
if (!validated.valid) {
throw new Error(validated.message)
}
const token = await verifyToken(req.header('Authorization'))
if (token['cognito:username'] != req.params.username) {
throw new Error('Unauthorized')
}
const score = await addUserScore(req.params.username, req.body.level, req.body.score)
res.json(score)
}))
// Fetch top scores
app.get('/scores/:date', wrapAsync(async (req, res) => {
const scores = await fetchTopScores(req.params.date)
res.json(scores)
}))
app.use(function(error, req, res, next) {
res.status(400).json({ message: error.message });
});
module.exports = app
在此文件的顶部,您导入了 Express 和其他依赖项,包括您在前面的模块中查看过的身份验证帮助程序函数和数据访问函数。然后,您可以在函数中配置所需的各种路由,例如用户用于登录并获取 ID 令牌的 /login,或者用于获取特定用户的最高分数的 /users/:username。最后,在文件的底部,脚本导出 Express 应用程序。
然后,查看 application/handler.js。这是带有入口点方法的文件,您告知 Lambda 在收到传入请求时调用该方法。此文件的内容如下:
// application/handler.js
const awsServerlessExpress = require('aws-serverless-express')
const app = require('./app')
const server = awsServerlessExpress.createServer(app)
exports.handler = (event, context) => { awsServerlessExpress.proxy(server, event, context) }
此处理程序正在使用 aws-serverless-express 程序包。此程序包将传入的 API Gateway 请求转换为 Express.js 框架期望所需要的标准请求。这让使用 Lambda 和 API Gateway 运行 Express.js 代码变得简单。
我们来使用您在前几面的模块中看到的 fetchUser 函数,对您的终端节点进行测试。这一次,您将全面了解 Web 应用程序,而不是直接调用函数。
在终端中运行以下命令:
[{"game_id":101,"username":"ubecker","gamedate":"2019-11-06 09:00:37","score":9090,"level":84},{"game_id":148,"username":"ubecker","gamedate":"2019-11-10 07:53:27","score":8428,"level":30},{"game_id":146,"username":"ubecker","gamedate":"2019-11-06 13:28:49","score":8052,"level":86},{"game_id":33,"username":"ubecker","gamedate":"2019-11-08 08:05:11","score":7218,"level":18},{"game_id":5,"username":"ubecker","gamedate":"2019-11-07 17:56:25","score":6983,"level":91},{"game_id":252,"username":"ubecker","gamedate":"2019-11-05 18:57:45","score":5403,"level":8},{"game_id":245,"username":"ubecker","gamedate":"2019-11-10 06:16:58","score":5230,"level":75},{"game_id":51,"username":"ubecker","gamedate":"2019-11-07 10:44:46","score":5043,"level":2},{"game_id":282,"username":"ubecker","gamedate":"2019-11-07 02:58:57","score":4884,"level":17},{"game_id":106,"username":"ubecker","gamedate":"2019-11-07 07:56:40","score":4394,"level":17}]
成功! 您命中了 API 终端节点。这触发了 Lambda 函数,该函数使用 Data API 从 Amazon Aurora Serverless 数据库中获取用户的最高分数。