javascript - 带有 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();
};
有任何想法吗?
解决方案
我解决了其中一个问题 - 更改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>'
);
});
}
});
});
事实上,我认为根本没有什么可附加的,任何人都可以帮忙吗?
推荐阅读
- python - 在 Scala 项目中使用 python 库
- angular - 角 httpClient
- docker - 如何使用 gitlab CI/CD 变量在 docker-compose.yml 中进行更改
- javascript - 重构具有相同对象属性值的数组
- mediawiki - 如何在 Mediawiki 的信息框中调整图像大小?
- css - 角材料在条件下移除垫子无线电容器
- xml - 将html字符串转换为html文档时,DOMParser将子样式添加到父项
- android - Xamarin 自定义渲染器事件未从 TabbedPage 触发
- php - PHP conditional logic AND OR
- android - 片段中的Android小部件视图在Rx订阅中获得IllegalStateException