簡體   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