[英]Close Mongoose connection Lambda
我在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');
};
此代码可以正常工作。
现在...让我们尝试关闭连接。 (哈哈)
无论在if的任何情况下,在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服务器返回数据
提前Thks
我发现了问题。
问题是上下文。 还有回调。 我更改代码以在处理程序中包括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();
});
});
};
希望有人觉得有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.