1

如何在无服务器框架中使用 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的合适文档

4

5 回答 5

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");

可以使用连接变量来编写这样的mysql查询component/lib/index.js

module.exports.respond = function(event, cb) {

    var query="SELECT * from table_name";

    connection.query(query,function(err,rows) {

    })
};
于 2016-03-15T11:28:16.073 回答
0

您必须在函数之外建立连接,因为我们正在使用 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
}

在你的 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
};
于 2016-10-03T15:41:04.923 回答
0

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

您还可以考虑使用数据库连接池

于 2016-03-23T00:45:18.150 回答
0

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

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

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

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

于 2019-11-25T13:24:20.887 回答
0

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

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

于 2016-03-15T08:07:37.657 回答