我想从与无服务器框架(serverless.com)一起部署的AWS lambda函数中访问MongoDB
该框架有一个示例说明如何打开(https://github.com/serverless/examples/blob/master/aws-node-rest-api-mongodb/handler.js)
但是,如果我正确理解了代码,它们将为每个请求打开和关闭连接(示例的相关代码):
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)))
));
};
我的假设是否错误,并且连接仍然有效?如果没有,保持连接打开的正确模式将是什么样子。我知道在AWS Lambda中可以存在一个全局状态,但是显然,无服务器框架会在单次运行后删除所有内容,因为不会保留我全局设置的状态。
答案 0 :(得分:1)
如果您希望在以后的请求后继续连接Lambda函数,则应在Lambda函数本身之外打开连接,该连接的范围应与示例顶部声明的const相同。无服务器框架不是关闭任何框架的方法,这是Lambda本身的功能。
此外,您正在使用名为dbConnectAndExecute
的函数,在函数外部进行连接然后在其中执行可能会更有用。即分解该功能。这样,您的连接将保持打开状态,但是在Lambda执行之后,该执行将被丢弃。
一个警告。当心您的MongoDB集群上有太多打开的连接。这就是我更喜欢使用DynamoDB之类的不存在连接的服务的原因之一。一切都通过API调用执行。如果您有1000个同时执行的Lambda函数,则每个函数都有其自己的连接,以后可能会导致查询失败。