amazon-web-services - 如何使用nodejs在lambda函数中进行dynamodb分页
问题描述
我希望前端在 event.queryStringParameters 中决定 currentPage、pageSize(一页中的数据数)和排序(+ 表示升序/- 表示降序)。
Dynamodb 属性
-id(string)(partition key)
-createdAt(date)
-url(string)
-createdBy(string)
-title(string)
但是我创建这个函数很麻烦,我只能设置pageSize,我不知道如何处理currentPage和我的函数中的排序。
下面是我当前的 lambda 函数。
getBanner.js
'use strict'
const AWS = require('aws-sdk');
exports.handler = async function (event, context, callback) {
const documentClient = new AWS.DynamoDB.DocumentClient();
let responseBody = "";
let statusCode = 0;
const queryParams = JSON.stringify(event.queryStringParameters);
/* queryParams will look like this
{
"currentPage": "0",
"pageSize": "30",
"sorting": "-status"
}
*/
const params = {
TableName : "Banner",
Limit:queryParams.pageSize
};
try{
const data = await documentClient.scan(params).promise();
responseBody = JSON.stringify(data.Items);
statusCode = 200
}catch(err){
responseBody = `Unable to get Alerts: ${err}`;
statusCode = 403
}
const response = {
statusCode: statusCode,
headers:{
"Content-Type": "application/json",
'Access-Control-Allow-Origin': '*', // Required for CORS support to work
},
body: responseBody
}
return response
}
解决方案
分页在 DynamoDB 中不起作用(链接到文档)。这是另一个示例,说明 SQL 数据库实践知识可能会阻碍您对 DynamoDB 的理解。
DynamoDB 对scan
和query
操作的响应限制为 1MB。任何比这更大的东西都会被分页。这意味着 DynamoDB 将根据响应的大小而不是响应中的项目数对结果进行分页。此限制可确保您的响应保持较小且易于管理,同时您的查询保持高性能。
一次获取 1MB 的数据与一次获取N
行不同,这在 SQL 数据库中的分页中很常见。在实现前端解决方案之前,花点时间阅读一下 DDB 如何使用LastEvaluatedKey
和处理分页。ExclusiveStartKey
推荐阅读
- file-upload - Yii2上传视频文件返回错误400
- node.js - Dialogflow 实现 webhook url 支持自签名证书吗?
- frama-c - 无法证明frama-c中的欧几里得除法
- amazon-web-services - AWS 子域指向子域
- javascript - 使画布在大于窗口大小的尺寸上可滚动
- c++ - 无法使用来自 bazel 的 boost/iostream 构建项目包
- php - 在多语言网站中生成链接
- compression - 压缩现有邮件文件,在 Roundcube (dovecot, centos) 中可读
- javascript - React Native 中的 React 导航图标
- spring - 具有自动配置的属性不适用于 Spring Cloud Stream 和 rabbitmq