У меня настроена безсерверная среда, и я пытаюсь звонить в базу данных MySQL с пулами соединений mysql. Все прекрасно работает, когда пароль mysql хранится в зашифрованном виде в переменной окружения. Однако, когда я шифрую переменную среды, а затем пытаюсь расшифровать ее с помощью функции, основанной на обещаниях, пул соединений больше не работает. Я переместил пул соединений в функцию обещания, которая обрабатывает мои запросы, и это сработало, но также создает новый пул соединений для каждого запроса, так что это плохо.
var express = require('express')
var bodyParser = require('body-parser')
var awsServerlessExpressMiddleware = require('aws-serverless-express/middleware')
var AWS = require("aws-sdk");
var mysql = require('mysql');
// declare a new express app
var app = express()
app.use(bodyParser.json())
app.use(awsServerlessExpressMiddleware.eventContext())
// Enable CORS for all methods
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*")
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
next()
});
const kms = new AWS.KMS();
// let decrypted;
function decryptEnvVar(val){
const p = new Promise((res,reject)=>{
kms.decrypt({ CiphertextBlob: Buffer(val, 'base64') }, (err, data) => {
if (err) {
console.log('Decrypt error:', err);
reject(err);
}
var decrypted = data.Plaintext.toString('ascii');
res(decrypted);
});
});
return p;
// })
}
var pool;
decryptEnvVar('process.env.RDS_PASSWORD').then(decrypt=>{
pool = mysql.createPool({
host : process.env.RDS_TEST_HOSTNAME,
password : decrypt,
password: process.env.RDS_TEST_PASSWORD,
port : process.env.RDS_PORT,
database: process.env.RDS_DATABASE
});
})
function sqlReq(sql){
const p = new Promise((res,reject)=>{
pool.getConnection(function(err, connection) {
console.log('connection');
if (err){
console.log(err);
reject(err); // not connected!
}
// Use the connection
connection.query(sql, function (error, results, fields) {
// When done with the connection, release it.
connection.release();
// Handle error after the release.
if (error){
reject(error);
}
// Don't use the connection here, it has been returned to the pool.
res(results);
});
});
// });
}).catch(err => {
return err;
});
return p;
}
app.get('/api/some_endpoint', function(req, res){
var sql = "Some SQL statement";
sqlReq(sql).then(resp=>{
res.json({'resp': resp});
}).catch(err=>{
res.json({err});
});
});
This results in no data being passed back to my app.