带节点的无服务器框架 MySQL
Serverless Framework with Node MySQL
如何使用 mysql 与无服务器的连接 framework.connection 应该在我的组件函数中可用,而无需在组件函数中每次都创建 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 的正确文档
我相信您在基于无服务器框架的项目中创建了一个包含多个 lambda 函数的组件。现在您要编写 MySQL 连接代码,以便此代码块可在该组件的所有 lambda 函数中重复使用。
如果这是问题,那么 Serverless 确实在您的 Component 目录中提供了一个 "lib" 文件夹,您可以利用它来编写要重复使用的通用代码逻辑。由于您的组件有一个基于 NodeJS 的运行时,因此您的组件文件夹中应该有一个 "index.js" 文件 -
your_serverless_project_directory/component_name/lib/index.js
您要做的第一件事是将 MySQL 连接代码逻辑添加到 index.js 中的 function/method。
Serverless 应该已经为您在所有 lambda 函数的 handler.js 代码中包含了整个 lib/ 文件夹,如下所示 -
var lib = require('../../lib');
因此,next/final 您想要做的事情是像这样重新使用您的连接 function/method(在属于您的组件内的所有 lambda 函数中)-
module.exports.handler = function(event, context) {
lib.mySQLConnection();
};
希望这对您有所帮助,让我知道进展如何。
我正在写我自己问题的答案
在 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) {
})
};
以 Normal Goswami 的回答为基础:
您已在此处指定连接中的数据库。我的 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
}
您也可以考虑使用 database connection pool。
你必须让连接失效,就像我们用 mongodb 做的那样
我们正在 Lambda 函数之外建立 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 上使用无服务器框架。
尽管您可以创建连接并将其分配给 frozen 变量,但不能保证您的 lambda 不会创建新连接。原因如下:
迄今为止最好的方法(在我个人看来)是为数据库相关操作创建一个单独的 lambda 函数并通过其他 lambda 调用该函数。这是流程:
客户端 -> registerUserLambda -> dbLambda -> 数据库
但是,lambdas 的问题在于,当请求过多时,会创建新的容器来处理其他请求。也就是说,将创建新的连接。因此,连接池的概念目前在无服务器 lambdas 上效果不佳。
如何使用 mysql 与无服务器的连接 framework.connection 应该在我的组件函数中可用,而无需在组件函数中每次都创建 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 的正确文档
我相信您在基于无服务器框架的项目中创建了一个包含多个 lambda 函数的组件。现在您要编写 MySQL 连接代码,以便此代码块可在该组件的所有 lambda 函数中重复使用。
如果这是问题,那么 Serverless 确实在您的 Component 目录中提供了一个 "lib" 文件夹,您可以利用它来编写要重复使用的通用代码逻辑。由于您的组件有一个基于 NodeJS 的运行时,因此您的组件文件夹中应该有一个 "index.js" 文件 -
your_serverless_project_directory/component_name/lib/index.js
您要做的第一件事是将 MySQL 连接代码逻辑添加到 index.js 中的 function/method。
Serverless 应该已经为您在所有 lambda 函数的 handler.js 代码中包含了整个 lib/ 文件夹,如下所示 -
var lib = require('../../lib');
因此,next/final 您想要做的事情是像这样重新使用您的连接 function/method(在属于您的组件内的所有 lambda 函数中)-
module.exports.handler = function(event, context) {
lib.mySQLConnection();
};
希望这对您有所帮助,让我知道进展如何。
我正在写我自己问题的答案
在 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
module.exports.respond = function(event, cb) {
var query="SELECT * from table_name";
connection.query(query,function(err,rows) {
})
};
以 Normal Goswami 的回答为基础:
您已在此处指定连接中的数据库。我的 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
}
您也可以考虑使用 database connection pool。
你必须让连接失效,就像我们用 mongodb 做的那样 我们正在 Lambda 函数之外建立 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 上使用无服务器框架。
尽管您可以创建连接并将其分配给 frozen 变量,但不能保证您的 lambda 不会创建新连接。原因如下: 迄今为止最好的方法(在我个人看来)是为数据库相关操作创建一个单独的 lambda 函数并通过其他 lambda 调用该函数。这是流程:
客户端 -> registerUserLambda -> dbLambda -> 数据库
但是,lambdas 的问题在于,当请求过多时,会创建新的容器来处理其他请求。也就是说,将创建新的连接。因此,连接池的概念目前在无服务器 lambdas 上效果不佳。