首页 > 解决方案 > 带有 websocket 的无服务器 lambda 不保存接收到的数据

问题描述

我正在尝试使用 Javascript 从 HTML 表单访问我的 node.js lambda 函数之一,但 lambda 不保存数据。

这是来自 HTML 页面的 Javascript:

                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();
};

sendMessageHandler 的 sls 日志不返回任何错误,但我没有看到请求的任何结果。另外,我还有另一个 lambda,它应该去获取所有保存的消息,但返回通道键未定义的错误。

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();
};

有任何想法吗?

标签: javascriptnode.jswebsocketserverless

解决方案


我解决了其中一个问题 - 更改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>'
                            );
                        });
                    }
                });
            });

事实上,我认为根本没有什么可附加的,任何人都可以帮忙吗?


推荐阅读