在无服务器框架中保持MongoDB连接打开

在无服务器框架中保持MongoDB连接打开,mongodb,mongoose,aws-lambda,serverless-framework,Mongodb,Mongoose,Aws Lambda,Serverless Framework,我想从使用serverless框架(serverless.com)部署的AWS lambda函数中访问MongoDB 有一个关于框架如何打开它的示例() 但如果我正确理解了代码,他们会为每个请求打开和关闭连接(示例的相关代码): 我的假设是错误的,而且这种联系还活着吗?如果不是,保持连接打开的正确模式是什么样子的。我知道在AWS lambda中可能存在全局状态,但显然,无服务器框架在单次运行后会删除所有内容,因为我在全局设置的状态不会被持久化。如果您希望在后续请求温暖的lambda函数时保持连接

我想从使用serverless框架(serverless.com)部署的AWS lambda函数中访问MongoDB

有一个关于框架如何打开它的示例()

但如果我正确理解了代码,他们会为每个请求打开和关闭连接(示例的相关代码):


我的假设是错误的,而且这种联系还活着吗?如果不是,保持连接打开的正确模式是什么样子的。我知道在AWS lambda中可能存在全局状态,但显然,无服务器框架在单次运行后会删除所有内容,因为我在全局设置的状态不会被持久化。

如果您希望在后续请求温暖的lambda函数时保持连接,您应该在Lambda函数本身之外打开连接,该连接的作用域与您在示例顶部声明的常量的作用域相同。无服务器框架并不是关闭任何东西的框架,这是Lambda本身的一个特性

此外,您正在使用一个名为dbConnectAndExecute的函数,在该函数中,在函数外部连接,然后在函数内部执行可能更有用;i、 打破这个功能。这样,您的连接将保持打开状态,但在Lambda执行后,执行将被放弃

一句警告的话。注意MongoDB集群上有太多打开的连接。这是我喜欢使用像DynamoDB这样的服务的原因之一,在这种服务中,连接根本不存在;一切都是通过API调用执行的。如果有1000个同时执行Lambda函数,每个函数都有自己的连接,可能会导致以后查询失败。

这可能会有所帮助,
const mongoString = ''; // MongoDB Url

const dbExecute = (db, fn) => db.then(fn).finally(() => db.close());
function dbConnectAndExecute(dbUrl, fn) {
  return dbExecute(mongoose.connect(dbUrl, { useMongoClient: true }), fn);
}

module.exports.createUser = (event, context, callback) => {
     dbConnectAndExecute(mongoString, () => (
       user
       .save()
       .then(() => callback(null, {
       statusCode: 200,
       body: JSON.stringify({ id: user.id }),
      }))
      .catch(err => callback(null, createErrorResponse(err.statusCode, err.message)))
    ));
};