带节点的无服务器框架 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 上效果不佳。