A mysql wrapper that will allow to make simple read operations
const mysql = require('mysql2')
const createConnection = (connectedCB) => {
const envParams = {
host: process.env.host,
user: process.env.user,
password: process.env.password,
database: process.env.database,
}
if (Object.keys(envParams).some(k => envParams[k] == null)) {
return connectedCB("Error, missing env variables.");
}
const config = {
...envParams,
ssl: "Amazon RDS"
}
let con = mysql.createConnection(config)
con.connect(function(err) {
// Connection error
if (err) {
con = 'error connecting to db: ' + err.stack
}
connectedCB(con);
});
}
const query2 = (query, params, fieldAliases, httpRes, consume = x => x) => {
createConnection(con => {
if(typeof con === 'string') {
httpRes.statusCode = 500;
httpRes.end(con)
return
}
con.execute(query, params, function (error, results, fields) {
try {
// Query error
if (error) {
httpRes.statusCode = 500;
httpRes.end("Query error " + error)
}
else {
// Handle result
const mapper = getAliasMapper(fields, fieldAliases)
const stringResponse = JSON.stringify(results.map(mapper))
httpRes.end(consume(stringResponse))
}
} catch(e) {
// Result handling error
httpRes.statusCode = 500;
httpRes.end("Result handling error " + e.stack)
} finally {
// Finish connection safely
con.end(error => console.log(error));
}
});
});
}
const getAliasMapper = (fields, fieldAliases) => origin => {
const useAlias = fieldAliases.length != 0
const arr = useAlias ? fieldAliases : fields
const target = {}
for (let i = 0; i < arr.length; i++) {
const key = useAlias ? fieldAliases[i]: `field${i}`
if (key != null)
target[key] = origin[fields[i].name]
}
return target
}
const getAssocMapper = fields => origin =>
`"${[origin[fields[0].name]]}":${origin[fields[1].name]}`
// "USA" | 13000 => { "USA": 13000 }
const queryMap = (query, params, httpRes) => {
createConnection(con => {
if(typeof con === 'string') {
console.error(con)
httpRes.statusCode = 500;
httpRes.end(con)
return
}
con.execute(query, params, function (error, results, fields) {
try {
// Query error
if (error) {
const errorMessage = "Query error : " + error+ " query: " + query
httpRes.statusCode = 500;
httpRes.end(errorMessage)
}
else {
// Handle result
const mapper = getAssocMapper(fields)
const stringResponse = `{${results.map(mapper).join(",")}}`
httpRes.end(stringResponse)
}
} catch(e) {
// Result handling error
const resultErrorMessage = "Result handling error: " + e.stack
console.log(resultErrorMessage)
httpRes.statusCode = 500;
httpRes.end(resultErrorMessage)
} finally {
// Finish connection safely
con.end(error => console.log(error));
}
});
});
}
module.exports = {
query2,
queryMap,
}