繁体   English   中英

带有节点MySQL的无服务器框架

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM