是否可以将参数传递给使用AWS API Gateway的WebSocket连接?

时间:2020-09-02 19:16:24

标签: amazon-web-services websocket aws-lambda aws-api-gateway

以下示例项目为例:https://github.com/aws-samples/simple-websockets-chat-app

onconnect方法如下:

const AWS = require('aws-sdk');

const ddb = new AWS.DynamoDB.DocumentClient({ apiVersion: '2012-08-10', region: process.env.AWS_REGION });

exports.handler = async event => {
  const putParams = {
    TableName: process.env.TABLE_NAME,
    Item: {
      connectionId: event.requestContext.connectionId
    }
  };

  try {
    await ddb.put(putParams).promise();
  } catch (err) {
    return { statusCode: 500, body: 'Failed to connect: ' + JSON.stringify(err) };
  }

  return { statusCode: 200, body: 'Connected.' };
};
  1. 如何查看此event对象具有的其他字段?我找不到文档。

  2. 连接到Websocket时可以从客户端传递参数吗?像wss://path.to.socket/someparameter一样,如何从该event对象访问它?

我想向数据库添加另一个参数:

const putParams = {
  TableName: process.env.TABLE_NAME,
  Item: {
    connectionId: event.requestContext.connectionId,
    someparameter: event.someparameter               // <-- What's the right way?
  }
};

谢谢!

1 个答案:

答案 0 :(得分:2)

要在连接时传递参数:wss://path.to.socket?param1=value1&param2=value2

如果使用wscat,则可能需要添加引号:

wscat -c 'wss://path.to.socket?param1=value1&param2=value2'

要通过lambda访问参数,请执行以下操作:

exports.handler = async event => {
    const { connectionId, domainName, stage } = event.requestContext;
    const param1 = event.queryStringParameters.param1;
    const param2 = event.queryStringParameters.param2;
    //or: const { param1, param2 } = event.queryStringParameters;

    ...

};