将expressjs应用程序迁移到无服务器-express会话问题

将expressjs应用程序迁移到无服务器-express会话问题,express,session,serverless,Express,Session,Serverless,我们实现了一个典型的express应用程序(它主要是一个RESTAPI,但也有一些其他逻辑,如passport js登录流和会话管理)。现在使用AWS Lambdas将其迁移到无服务器。最初的express应用程序使用express session package以postgres作为存储来维护会话信息。应用程序现在已部署到AWS-第一个请求有效,然后第二个请求因内部服务器错误而失败。我们很难找出原因。这不是超时。我们尝试用postgres、DynamoDB和in-memory设置express

我们实现了一个典型的express应用程序(它主要是一个RESTAPI,但也有一些其他逻辑,如passport js登录流和会话管理)。现在使用AWS Lambdas将其迁移到无服务器。最初的express应用程序使用express session package以postgres作为存储来维护会话信息。应用程序现在已部署到AWS-第一个请求有效,然后第二个请求因内部服务器错误而失败。我们很难找出原因。这不是超时。我们尝试用postgres、DynamoDB和in-memory设置express会话,但仍然无法实现。为什么会这样?对于无服务器应用程序,推荐的会话管理解决方案是什么?

一种解决方案是使用JSON令牌。会话直接存储在客户端

理论上,在第一次连接时,为会话设置一个令牌,并将其发送给客户端

每次用户调用Api时,您都会发送JSON令牌。在服务器端,您用所需的数据填充它(它是一个对象)。。。然后再次发送给客户

这个过程有很多实现,JWT:


根据亚马逊的说法,管理会话的最佳方法是将其设置在第三方,正如您所说的

摘录:

* Storing local state is unreliable due to automatic scaling. Consider going stateless (using REST),
* or use an external state store (for MongoDB, you can use the connect-mongo package)
app.use(session({ secret: process.env.SESSION_SECRET }))
*/
为可伸缩性删除了会话状态(或者,您可以 使用connect mongo在MongoDB中存储会话状态

因此,正如亚马逊最佳实践所说,您应该尝试通过mongo实现它


这是推荐的方法,因为它直接来自Amazon…

在无状态、无服务器的环境中,会话管理是完全不同的

由于您尚未共享生成错误的代码,我只能笼统地说。一般的方法是将任何状态信息存储在数据库中,并在操作需要了解该状态时轮询数据库。或者,您可以使用该数据库节点中的侦听器来检测更改并将这些更改分发到前端结束


为了解决您的错误--再次假设,因为没有代码可供使用--如果您已将一个Express app迁移到serverless+数据库,并且第一个请求成功,但第二个请求失败,那么您可能在函数和DB之间的异步流中得到了错误处理承诺或某个地方


我会在访问数据库之前和之后的不同时间点查看并放置一些console.log语句,以查看您是否获得了预期的实际数据,或是尚未解决的承诺。祝您好运!

您是否有一些错误消息要显示?日志文件记录了哪些关于“内部服务器错误”的信息?抱歉,不再有错误消息。仅“内部服务器错误”和空json响应。您是否查看了CloudWatch的更多日志?我知道JWT,我不想在这种情况下使用它们。我想了解在使用express会话时,是什么让express应用程序在第二次请求时挂起。必须是一些aws lambda的详细信息。”您可能在异步流中的某个地方遇到了错误"-->是的,这很有帮助。但我想说的是:为什么在serverless+lambda中被拒绝的承诺是一个问题通常这样的事情不会挂起一个进程。不是被拒绝的承诺,而是一个在lamda调用结束后悬而未决并得到解决的承诺。这不是一个永久运行的服务器。这是所有云功能平台的问题,不是吗只有AWS。