Может ли "ОШИБКА необработанного отказа от обещания" быть проблемой в aws lambda? - PullRequest
0 голосов
/ 09 октября 2019

Может ли это каким-либо образом в функции повредить поток, к которому они принадлежат?

У меня есть лямбда, которая работает за конечной точкой веб-сокета API-шлюза.

Это просто запрашивает clientId и сообщениеПолезная нагрузка, запросите все соединения в динамо для этого clientId (интерфейс приборной панели в реальном времени для нескольких устройств) и обновите всех заинтересованных пользователей.

Работает нормально, если вы проверяете неисправность "wscat" в командной строке, но в браузере реального мира он глючитиспользуя js websocket api или c # websocket api.

Делаете ли вы что-нибудь кроме этого?

const AWS = require("aws-sdk");
let dynamo = new AWS.DynamoDB.DocumentClient();

require("aws-sdk/clients/apigatewaymanagementapi");

const ORDERS_TABLE = "ordersTable";

const successfullResponse = {
  statusCode: 200,
  body: "everything is alright"
};

module.exports.sendMessageHandler = (event, context, callback) => {
  console.log(event);
  sendMessageToAllConnectedClientDevices(event)
    .then(data => {
      console.log("sucesso", data);
      callback(null, successfullResponse);
    })
    .catch(err => {
      console.log("erro: ", err);
      callback(null, JSON.stringify(err));
    });
};

const sendMessageToAllConnectedClientDevices = async event => {
  try {
    const body = JSON.parse(event.body);
    const { clientId } = body;
    console.log(
      "handler.sendMessageToAllConnectedClientDevices.clientId: ",
      clientId
    );

    const connectionIds = await getConnectionIds(clientId);

    return await Promise.all(
      connectionIds.Items.map(connectionId => {
        send(event, connectionId.connectionId);
      })
    );
  } catch (error) {
    console.log("erro sendMessageToAllConnectedClientDevices");
    return error;
  }
};

const getConnectionIds = async clientId => {
  console.log("handler.getConnectionIds.clientId: ", clientId);

  const params = {
    TableName: ORDERS_TABLE,
    // IndexName: "client_gsi",
    FilterExpression: "clientId = :cliend_id",
    // KeyConditionExpression: "clientId = :cliend_id",
    ProjectionExpression: "connectionId",
    ExpressionAttributeValues: {
      ":cliend_id": clientId
    }
  };

  console.log("handler.getConnectionIds.params: ", JSON.stringify(params));

  const data = await dynamo.scan(params).promise();
  return data;
};

const send = async (event, connectionId) => {
  const body = JSON.parse(event.body);
  const postData = body.data;

  const endpoint =
    event.requestContext.domainName + "/" + event.requestContext.stage;
  const apigwManagementApi = new AWS.ApiGatewayManagementApi({
    apiVersion: "2018-11-29",
    endpoint: endpoint
  });

  const params = {
    ConnectionId: connectionId,
    Data: postData
  };

  return await apigwManagementApi.postToConnection(params).promise();
};

ОШИБКА Необработанное отклонение обещания

1 Ответ

0 голосов
/ 09 октября 2019

Мне кажется, проблема в API-шлюзе, проверьте, как вы обрабатываете информацию, передаваемую в функцию Lambda (потому что браузер отправляет некоторую дополнительную информацию по сравнению с вызовом командной строки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...