![](/img/trans.png)
[英]Serverless Framework with Node MySQL: PROTOCOL_INCORRECT_PACKET_SEQUENCE error
[英]Serverless Framework with Node MySQL
如何在无服务器框架中使用mysql连接。连接应该在我的组件函数中可用,而无需每次在组件函数中创建mysql连接
试过这样
var mysql = require('mysql');
module.exports.respond = function(event, cb) {
var pool = mysql.createPool({
connectionLimit : 100,
host : 'hostname',
user : 'username',
password : 'password',
database : 'databasename',
debug : false
});
var message='';
pool.getConnection(function(err,connection){
if(err) {
message='Could not connect to database';
} else {
message="Database is connected";
}
var response = {
message: message
};
return cb(null, response);
});
};
但是上面的代码仅适用于当前功能,想在无服务器框架中使mysql连接变得通用,找不到关于如何在无服务器框架中使用mysql的适当文档
我正在写我自己的问题的答案
在component/lib
文件夹中创建database.js
文件
database.js代码
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'hostname',
user : 'username',
password : 'password',
database : 'databasename'
});
connection.connect();
module.exports = connection;
在component/lib/index.js
文件中创建了这样的对象
var connection = require("../lib/database.js");
可以使用连接变量在component/lib/index.js
编写这样的mysql查询
module.exports.respond = function(event, cb) {
var query="SELECT * from table_name";
connection.query(query,function(err,rows) {
})
};
我相信您在基于Serverless Framework的项目中创建了一个包含多个lambda函数的组件。 现在,您要编写MySQL连接代码,以使该代码块可在该组件的所有lambda函数中重复使用。
如果这是要问的问题,那么Serverless确实会在Component目录中提供一个“ lib”文件夹,您可以利用该文件夹编写要重复使用的通用代码逻辑。 由于您的组件具有基于NodeJS的运行时,因此Component文件夹中应该有一个“ index.js”文件-
your_serverless_project_directory/component_name/lib/index.js
您要做的第一件事是将MySQL连接代码逻辑添加到index.js中的函数/方法中。
Serverless应该已经为您所有lambda函数的handler.js代码中包括了整个lib /文件夹,如下所示-
var lib = require('../../lib');
因此,您要做的下一个/最后一件事是重新使用连接函数/方法(在属于组件内部的所有lambda函数中),如下所示:
module.exports.handler = function(event, context) {
lib.mySQLConnection();
};
希望这会有所帮助,让我知道如何进行。
要建立普通戈斯瓦米人的答案:
您已经在此处的连接中指定了数据库。 我的lambda每个都需要不同的数据库,因此在连接代码中只需删除数据库即可:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'hostname',
user : 'username',
password : 'password'
// no database here
});
connection.connect();
module.exports = connection;
然后使用一个奇怪的函数来更改每个lambda函数中的数据库:
connection.changeUser({database: database}, function(err) {
if (err) { throw err; }
});
connection.query(sql, function(err, rows, fields) {
// etc
}
您还可以考虑使用数据库连接池 。
您必须使连接失去功能,因为我们正在使用mongodb进行连接,因此我们正在Lambda Function之外进行mongodb连接。
我来自https://github.com/malikasinger1/serverles-practice/tree/master/mongodb-connection的代码段:
var mongoose = require("mongoose");
var dbURI = 'mongodb://localhost/mydatabase';
mongoose.connect(dbURI);
mongoose.connection.on('connected', function () {//connected
console.log("Mongoose is connected");
// process.exit(1);
});
module.exports.signup = (event, context, cb) => {
//doing signup here
}
在您的面前,很可能是这样的:
var mysql = require('mysql');
//make connection here
var pool = mysql.createPool({
...
});
pool.getConnection(function(err,connection){
...
});
module.exports.respond = function(event, cb) {
//use connection here
};
我假设您正在AWS上使用无服务器框架。
尽管您可以创建一个连接并将其分配给冻结变量,但不能保证您的lambda不会创建新连接。 原因如下:到目前为止(以我个人观点),最好的方法是为与数据库相关的操作创建一个单独的lambda函数,然后通过其他lambda调用此函数。 流程如下:
客户端-> registerUserLambda-> dbLambda->数据库
但是,关于lambda的问题是,当请求过多时,将创建新的容器来处理其他请求。 即,将创建新的连接。 因此,连接池的概念目前在无服务器的lambda上不能很好地工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.