Javascript 在GET请求中使用多个参数从DynamoDB获取数据
我在node中编写了一个lambda函数,我正在尝试获取特定训练课程的数据 url看起来像这样Javascript 在GET请求中使用多个参数从DynamoDB获取数据,javascript,node.js,aws-lambda,amazon-dynamodb,Javascript,Node.js,Aws Lambda,Amazon Dynamodb,我在node中编写了一个lambda函数,我正在尝试获取特定训练课程的数据 url看起来像这样 workout/{workoutId}/sessions/{sessionId} 我知道如果我只想使用workUtid module.exports.getWorkoutSession = (event, context, callback) => { const { workoutId } = event.pathParameters; const params = { Ta
workout/{workoutId}/sessions/{sessionId}
我知道如果我只想使用workUtid
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中。如果您有这两个用例-
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;
}
};
答案取决于数据如何存储在Dynamo DB中。如果您有这两个用例-
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;
}
};
您是在询问如何从路径参数获取会话ID,还是如何从DynamoDB获取会话数据?第一个问题的答案是
event.pathParameters.sessionId
。第二个问题的答案取决于如何在DDB中存储数据。还是我误解了你的问题?我问的是如何从数据库获取会话数据,这取决于如何在DDB中存储会话。您是在询问如何获取已存储的会话数据,还是同时询问如何存储会话数据?我不清楚您的问题是关于数据建模、如何编写查询,还是同时询问如何从路径参数获取会话ID,或者如何从DynamoDB获取会话数据?第一个问题的答案是event.pathParameters.sessionId
。第二个问题的答案取决于如何在DDB中存储数据。还是我误解了你的问题?我问的是如何从数据库获取会话数据,这取决于如何在DDB中存储会话。您是在询问如何获取已存储的会话数据,还是同时询问如何存储会话数据?我不清楚您的问题是关于数据建模、如何编写查询,还是两者兼而有之,但我应该在哪里定义哈希键和范围键?它在服务器里吗?我对dyanamo很陌生,有多种可能。Aws控制台、SAM模板、无服务器模板。如果您使用的是serverless,那么您可以按照下面的步骤定义表,但是我在哪里定义哈希键和范围键呢?它在服务器里吗?我对dyanamo很陌生,有多种可能。Aws控制台、SAM模板、无服务器模板。如果您使用的是无服务器,则可以按照此步骤定义表