带有Node MySQL的无服务器框架

时间:2016-03-13 10:36:14

标签: mysql node.js aws-lambda serverless-framework

如何使用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的正确文件

5 个答案:

答案 0 :(得分:1)

我正在回答我自己的问题

database.js文件夹

中生成component/lib个文件

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) {

    })
};

答案 1 :(得分:0)

我相信您在基于无服务器框架的项目中创建了一个包含多个lambda函数的组件。现在你想编写MySQL连接代码,以便这个代码块可以在该组件的所有lambda函数中重用。

如果这是ask,那么Serverless确实在Component目录中提供了一个"lib"文件夹,您可以利用该文件夹编写要重用的公共代码逻辑。由于您的组件具有基于NodeJS的运行时,因此应该有一个" index.js"组件文件夹中的文件 -

your_serverless_project_directory/component_name/lib/index.js

您要做的第一件事是将MySQL连接代码逻辑添加到index.js中的函数/方法。

无服务器应该已经在你的所有lambda函数的handler.js代码中包含了这个完整的lib /文件夹 -

var lib = require('../../lib');

因此,您要做的下一个/最后一件事是重新使用您的连接函数/方法(在Component中的所有lambda函数中),如下所示 -

module.exports.handler = function(event, context) {
  lib.mySQLConnection();
};

希望这会有所帮助,让我知道它是怎么回事。

答案 2 :(得分:0)

建立正常的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

答案 3 :(得分:0)

你必须在功能上建立连接,因为我们正在使用mongodb 我们正在将lambda函数中的mongodb连接起来。

来自https://github.com/malikasinger1/serverles-practice/tree/master/mongodb-connection的代码段:

    public func above<T>(_ : T.Type)->(T)
在你的脸上,它最有可能是这样的:

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
}

答案 4 :(得分:0)

我假设您正在AWS上使用无服务器框架。

尽管您可以创建连接并将其分配给 frozen 变量,但不能保证您的lambda不会创建新的连接。原因如下: 到目前为止(以我个人观点),最好的方法是为与数据库相关的操作创建一个单独的lambda函数,并通过其他lambda调用此函数。这是流程:

客户端-> registerUserLambda-> dbLambda->数据库

但是,关于lambda的问题是,当请求过多时,将创建新的容器来处理其他请求。即,将创建新的连接。因此,连接池的概念目前在无服务器Lambda上无法很好地发挥作用。