Бессерверная лямбда с websocket не сохраняет полученные данные - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь получить доступ к одной из моих node.js лямбда-функций из формы HTML, используя Javascript, но лямбда не сохраняет данные.

Вот Javascript со страницы HTML:

                let user = document.getElementById('userLogged');
                let currentUser = user.textContent;
                let channel = document.getElementById('channelLogged');
                let currentChannel = channel.textContent;
                let message = $("#messageText").val();
                let socket = new WebSocket(WEBS + currentChannel);

                socket.onopen = () => {
                    socket.send(JSON.stringify({
                        action: "sendMessage",
                        data: {
                            messageText: message,
                            username: currentUser,
                            currentChannel: currentChannel
                        }
                    }));
                }
            });  

А вот моя функция lamba, которая должна отправлять и сохранять сообщения:


module.exports.sendMessageHandler = (event, context, callback) => {
    sendMessageToAllConnected(event).then(() => {
        callback(null, successfullResponse)
    }).catch (err => {
        callback(null, JSON.stringify(err));
    });
};

const sendMessageToAllConnected = (event) => {
    const body = JSON.parse(event.body);
    const message = body.data.messageText;
    const channel = body.data.currentChannel;
    const user = body.data.username;
  return getConnectionIds(channel).then(connectionData => {
    return connectionData.Items.map(connectionId => {
      return saveMessages.save(event, user, channel, message, connectionId.connectionId);
    });
  });
};

const getConnectionIds = channel => {
    const params = {
        TableName: CHATCONNECTION_TABLE,
        Key: {
            channel: channel
        },
        ProjectionExpression: 'connectionId'
    };
    return dynamo.scan(params).promise();
};


module.exports.getMessagesHandler = event => {
    const channel = event.queryStringParameters.channel;
    const params = {
        TableName: MESSAGE_TABLE,
        Key: {
          channel: channel
          },
        ProjectionExpression: 'username, messageDate, messageText'
    };
   return dynamo.scan(params).promise();
};

module.exports.save = (event, user, channel, message, 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 postParams = {
        connectionId : connectionId,
        Data: postData
    };

    const dbParams = {
        TableName: MESSAGE_TABLE,
        Item: {
            channel: channel,
            messageDate: Date.now(),
            username: user,
            messageText: message,
        }
    };
    dynamo.put(dbParams);

   return apigwManagementApi.postToConnection(postParams).promise();
};

Журналы sls для sendMessageHandler не возвращают никаких ошибок, но я не вижу никаких результатов от запроса. Кроме того, у меня есть другая лямбда, которая, как предполагается, go получает все сохраненные сообщения, но возвращает ошибку, что ключ канала не определен.

module.exports.getMessagesHandler = event => {
    const channel = event.queryStringParameters.channel;
    const params = {
        TableName: MESSAGE_TABLE,
        Key: {
          channel: channel
          },
        ProjectionExpression: 'username, messageDate, messageText'
    };
   return dynamo.scan(params).promise();
};

Есть идеи?

1 Ответ

0 голосов
/ 25 февраля 2020

Я решил одну из проблем - изменил const channel = event.queryStringParameters.channel; на const channel = event.query.channel;, и теперь я не получаю сообщение об ошибке, что channel не определено. Но теперь у меня проблема с добавлением результата getMessagesHandler к HTML. Вот код для этого.

                debugger;
                let user = $("#username").val();
                let channel = $("#channel").val();
                const URL = 'https://ktwdb7v696.execute-api.us-east-1.amazonaws.com/dev/getMessages?channel=';
                let realURL = URL + channel;
                $.ajax({
                    type: 'GET',
                    url: realURL,
                    success: function (data) {
                        $("#loginForm").css("visibility", "hidden");
                        $("#messageForm").css("visibility", "visible");
                        $("#messages").css("visibility", "visible");
                        // $("#userLogged").text(user);
                        // $("#channelLogged").text(channel);
                        document.getElementById('userLogged').innerHTML = user;
                        document.getElementById('channelLogged').innerHTML = channel;
                        document.getElementById('title').innerHTML = 'Please write a message to send';
                        data.Items.forEach(function (message) {
                            console.log(message.messageDate);
                            console.log(message.username);
                            console.log(message.messageText);
                            $('#messages').append('<p>Date: ' + message.messageDate + '</p>'
                                    + '<p>User: ' + message.username + '</p>'
                                    + '<p>Message: ' + message.messageText + '</p>'
                            );
                        });
                    }
                });
            });

На самом деле я думаю, что добавить вообще нечего, кто-нибудь может помочь с этим?

...