我建立了一个无服务器环境,我正在尝试使用mysql连接池调用MySQL数据库。当mysql密码未加密存储在环境变量中时,一切工作都很好。但是,当我加密环境变量,然后尝试使用基于Promise的函数对其解密时,连接池将不再起作用。我将连接池移到了可以处理我的查询并且可以正常工作的promise函数中,但是它还会为每个查询创建一个新的连接池,因此效果不佳。
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.