![](/img/trans.png)
[英]Serverless Framework with Node MySQL: PROTOCOL_INCORRECT_PACKET_SEQUENCE error
[英]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.