在 GET 请求中使用多个参数从 DynamoDB 获取数据
Getting data from DynamoDB using multiple parameters in GET Request
我有一个用 node 编写的 lambda 函数,我正在尝试获取特定锻炼课程的数据。
url 看起来像这样
workout/{workoutId}/sessions/{sessionId}
我知道如果我只想 workoutId
我可以做类似下面的事情
module.exports.getWorkoutSession = (event, context, callback) => {
const { workoutId } = event.pathParameters;
const params = {
TableName: workoutTable,
Key: {
id: workoutId,
},
};
return db.get(params).promise().then(res => {
if(res.item) {callback(null, response(200, res.Item));} else {
callback(null, response(404, {error: "workoutId not found"}))
}
})
};
但我如何修改此函数以便获取特定锻炼的会话数据?
答案取决于数据在 Dynamo DB 中的存储方式。如果您有这两个用例 -
- 获取 workoutId 的所有会话的数据(使用事件参数中的 workoutId)和
- 获取训练 ID 的特定会话的数据(使用事件参数中的 workoutId 和 sessionId)
那么这两个可以通过下面的table结构来解决
Hash Key: workoutId
Range Key(Partition Key): sessionId
和下面的代码
/** API to get all sessions of a workout. Called by url workout/{workoutId} */
module.exports.getWorkoutSessions = async (event, context, callback) => {
const { workoutId } = event.pathParameters;
const params = {
TableName: workoutTable,
KeyConditionExpression: '#workoutId = :workoutId',
ExpressionAttributeNames: {
'#workoutId': 'workoutId'
},
ExpressionAttributeValues: {
':workoutId': workoutId
}
};
const db = new AWS.DynamoDB.DocumentClient();
try {
const res = await db.query(params).promise();
return res.Items;
} catch (error) {
console.error('Error while getting workout sessions', error);
throw error;
}
};
/** API to get a specific session of a workout. Called by url workout/{workoutId}/sessions/{sessionId} */
module.exports.getWorkoutSession = async (event, context, callback) => {
const { workoutId, sessionId } = event.pathParameters;
const params = {
TableName: workoutTable,
Key: {
workoutId: workoutId,
sessionId: sessionId
}
};
const db = new AWS.DynamoDB.DocumentClient();
try {
return await db.getItem(params).promise();
} catch (error) {
console.error('Error while getting workout session', error);
throw error;
}
};
我有一个用 node 编写的 lambda 函数,我正在尝试获取特定锻炼课程的数据。
url 看起来像这样
workout/{workoutId}/sessions/{sessionId}
我知道如果我只想 workoutId
module.exports.getWorkoutSession = (event, context, callback) => {
const { workoutId } = event.pathParameters;
const params = {
TableName: workoutTable,
Key: {
id: workoutId,
},
};
return db.get(params).promise().then(res => {
if(res.item) {callback(null, response(200, res.Item));} else {
callback(null, response(404, {error: "workoutId not found"}))
}
})
};
但我如何修改此函数以便获取特定锻炼的会话数据?
答案取决于数据在 Dynamo DB 中的存储方式。如果您有这两个用例 -
- 获取 workoutId 的所有会话的数据(使用事件参数中的 workoutId)和
- 获取训练 ID 的特定会话的数据(使用事件参数中的 workoutId 和 sessionId)
那么这两个可以通过下面的table结构来解决
Hash Key: workoutId
Range Key(Partition Key): sessionId
和下面的代码
/** API to get all sessions of a workout. Called by url workout/{workoutId} */
module.exports.getWorkoutSessions = async (event, context, callback) => {
const { workoutId } = event.pathParameters;
const params = {
TableName: workoutTable,
KeyConditionExpression: '#workoutId = :workoutId',
ExpressionAttributeNames: {
'#workoutId': 'workoutId'
},
ExpressionAttributeValues: {
':workoutId': workoutId
}
};
const db = new AWS.DynamoDB.DocumentClient();
try {
const res = await db.query(params).promise();
return res.Items;
} catch (error) {
console.error('Error while getting workout sessions', error);
throw error;
}
};
/** API to get a specific session of a workout. Called by url workout/{workoutId}/sessions/{sessionId} */
module.exports.getWorkoutSession = async (event, context, callback) => {
const { workoutId, sessionId } = event.pathParameters;
const params = {
TableName: workoutTable,
Key: {
workoutId: workoutId,
sessionId: sessionId
}
};
const db = new AWS.DynamoDB.DocumentClient();
try {
return await db.getItem(params).promise();
} catch (error) {
console.error('Error while getting workout session', error);
throw error;
}
};