【问题标题】:Serverless Framework with Node MySQL带有节点 MySQL 的无服务器框架
【发布时间】:2016-06-28 09:46:56
【问题描述】:

如何在无服务器框架中使用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);
    });


};

但以上代码仅适用于当前功能,想在 serverless 框架中为 mysql 连接做通用的东西,找不到关于如何在 serverless 框架中使用 mysql 的合适文档

【问题讨论】:

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


    【解决方案1】:

    我正在写我自己问题的答案

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

    【讨论】:

    • 每次调用无服务器函数时,这是否会打开与数据库的新连接?这不会淹没数据库吗?
    • 感谢您的回答..我在添加文件时遇到问题 var connection = require("../lib/database.js");我必须将其替换为 var connection = require("./lib/database.js");
    【解决方案2】:

    我相信您在基于无服务器框架的项目中创建了一个包含多个 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();
    };
    

    希望这会有所帮助,请告诉我进展如何。

    【讨论】:

    • 你的答案也是正确的,但是请编写mySQLConnection函数的代码并更新你的答案,我会勾选你的答案为正确的
    【解决方案3】:

    以 Normal Goswami 的回答为基础:

    您已经在连接中指定了数据库。我的 lambdas 每个都需要不同的数据库,所以在连接代码中只需要离开数据库:

    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

    【讨论】:

      【解决方案4】:

      你必须在功能之外建立连接,因为我们正在使用 mongodb 我们正在 Lambda 函数之外建立 mongodb 连接。

      我的代码 sn-p 来自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
      }
      

      在你的 cace 中很可能是这样的:

      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
      };
      

      【讨论】:

        【解决方案5】:

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

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

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

        然而,关于 lambdas 的事情是,当请求过多时,会创建新的容器来处理其他请求。也就是说,将创建新的连接。因此,连接池的概念目前不适用于无服务器 lambda。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-13
          • 2019-02-20
          • 2017-07-13
          • 2021-08-23
          • 2016-03-20
          • 2017-12-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多