gpt4 book ai didi

node.js - 关闭 Mongoose 连接 Lambda

转载 作者:可可西里 更新时间:2023-11-01 09:57:48 30 4
gpt4 key购买 nike

我在 Amazon Web Services 中使用 Lambda 函数时发现了一个奇怪的行为。

我使用的是 Node 4.3 和 Mongoose 4.4.17

这个想法是测试和使用 Lambda 的功能。

我制作了一个简单的模型并将其存储在 Ec2 实例中。在我尝试关闭连接之前,代码工作正常。我知道,更好的做法是“不要关闭你的连接,让池处理”。好吧,这适用于普通应用程序,但 Lambda 是一个无状态函数,所以如果我不关闭连接,它会保持打开状态,消耗资源。当您每秒有数千个请求时,这可能会非常糟糕。

所以,这是我的代码。

'use strict';
let mongoose = require('mongoose');
//I add this options, because this close my connections
//faster than the 30 min by default
let options = { server: { socketOptions: { keepAlive: 30000, connectTimeoutMS: 30000 } }};
let db = mongoose.createConnection('mongodb://myInternalServerEC2:27017/myDB', options);
let Schema = require('mongoose').Schema;
let TempSchema =new Schema({name:{type:String,required:true}});
//This is a copy paste from an another project,
//but i can remove, but i don't think this has nothing
//with my problem.
personSchema.set('autoIndex', false);
personSchema.index({name:1});

let tempDB = db.model('tempcol', TempSchema);
exports.handler = (event, context, callback) => {
tempDB.find(function (err, data) {
if (typeof(data) === 'object' && data.length === 0) {
data = null;
}
if (!err && data !== null) {
callback(null, data);
} else if (!err) {
error = new Error("No data found");
callback(error);
} else {
callback(err);
}
}).populate('_typeId');
};

此代码可以正常工作。

现在...让我们尝试关闭连接。 (哈哈)

我在 ifs 的任何情况下都使用它,在 if 的末尾,在 find 函数中的 if 之后,等等。

db.close();
callback(null, data);

mongoose.disconnect();
callback('Some error');

//This finish inside the find function

finish(db, function(){
callback(error, data);
});
// A finish function with a callback,
// so i can call the parent callback
function finish(db, cb){
db.close(function(){
cb();
});
}

在每一个案例中。 Lambda 函数从不返回错误,只返回 NULL。

有人知道为什么 Lambda 中会出现这种行为吗?在本地模式下,我以前从未发生过这种行为。

如果我删除关闭指令,lambda 函数会从我的 Mongo 服务器返回数据

提前致谢

最佳答案

我发现了问题。

问题是上下文。和回调。我更改代码以在处理程序中包含 createConnection 事件。

https://aws.amazon.com/es/blogs/compute/getting-nodejs-and-lambda-to-play-nicely/

此代码有效。

'use strict';
let mongoose = require('mongoose');
let options = { server: { socketOptions: { keepAlive: 30000, connectTimeoutMS: 30000 } }};

let Schema = require('mongoose').Schema;
let TempSchema =new Schema({name:{type:String,required:true}});
TempSchema.set('autoIndex', false);
TempSchema.index({name:1});


exports.handler = (event, context) => {
let db = mongoose.createConnection('mongodb://myInternalServerEC2:27017/myDB', options);
let tempDB = db.model('tempcol', TempSchema);

function closeBD(cbk){
console.log("Close BD");
db.close(function(){
cbk();
});
}
tempDB.find(function (err, data) {
if (typeof(data) === 'object' && data.length === 0) {
data = null;
}
if (!err && data !== null) {
context.succeed(data);
} else if (!err) {
let error = new Error("No data found");
context.fail(error);
} else {
context.fail(err);
}
closeBD(function(){
context.done();
});
});
};

希望有人觉得这很有用。

关于node.js - 关闭 Mongoose 连接 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37280797/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com