Javascript 在GET请求中使用多个参数从DynamoDB获取数据

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

我在node中编写了一个lambda函数,我正在尝试获取特定训练课程的数据

url看起来像这样

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中。如果您有这两个用例-

  • 获取WorkUtid的所有会话的数据(使用事件参数中的WorkUtid)和
  • 获取训练Id的特定会话的数据(使用事件参数中的WorkUtid和sessionId)
  • 然后,这两个问题可以通过下表结构来解决

    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中。如果您有这两个用例-

  • 获取WorkUtid的所有会话的数据(使用事件参数中的WorkUtid)和
  • 获取训练Id的特定会话的数据(使用事件参数中的WorkUtid和sessionId)
  • 然后,这两个问题可以通过下表结构来解决

    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模板、无服务器模板。如果您使用的是无服务器,则可以按照此步骤定义表