try {
if (!conn) {
console.log("Attempting to Connect to Atlas");
conn = await MongoClient.connect(process.env.MONGO_URL, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
console.log("Successfully connected to Atlas");
}
} catch (err) {
console.log("Failed to connect to Atlas: ", err);
return {
statusCode: 500,
body: JSON.stringify(err),
};
}
上面是我通过Node连接Atlas的代码。 Atlas数据库尚未启用上述服务器的IP地址进行连接。因此它应该会失败。但是当失败时,catch块中的代码不会被执行,以下是日志:
2022-11-28T14:10:35.966-06:00 2022-11-28T20:10:35.966Z 7e455355-8126-4f71-afb3-2185683f9f8a INFO Attempting to Connect to Atlas
2022-11-28T14:10:38.725-06:00 2022-11-28T20:10:38.725Z 7e455355-8126-4f71-afb3-2185683f9f8a Task timed out after 3.01 seconds
2022-11-28T14:10:38.725-06:00 END RequestId: 7e455355-8126-4f71-afb3-2185683f9f8a
2022-11-28T14:10:38.725-06:00 REPORT RequestId: 7e455355-8126-4f71-afb3-2185683f9f8a Duration: 3008.53 ms Billed Duration: 3000 ms Memory Size: 128 MB Max Memory Used: 49 MB
2022-11-28T14:11:42.725-06:00 START RequestId: 7e455355-8126-4f71-afb3-2185683f9f8a Version: $LATEST
问题是,为什么它不抛出错误?为什么它不进入 catch 块?
这是 AWS 上尝试连接到 atlas 的 lambda 函数。
默认情况下
MongoDB
启动 30 秒后会发生连接超时。
如果您看到日志,则任务在 3 秒后立即超时,并且您需要支付 3 秒的 lambda 使用费用。所以,你的代码只执行了 3 秒并超时。尝试检查并将 lambda 的
timeout
增加到一分钟,您可能会看到实际的数据库连接失败。
理想情况下,如果您使用
serverless
,您可以将 timeout
作为选项或在 API 网关级别传递。