I am still very new to node.js. In my current test project I want to send a confirmation email or other emails, depending on the loaded template. The template is stored in MySQL.
The result I am getting is:
{
    "message": {
        "error": {},
        "foo": "bar"
    }
}
So the error bit is empty and I don't know why... If I reject manually at a different point in the code it works just fine, so the problem is not with the middleware, router or server.js file.
Also I have rejected "Foo: Bar" back, to check which catch block catched the error.
Here is my mailer.js file:
const nodemailer = require('nodemailer');
let conDB;
module.exports =  (injectedMySql) => {
    conDB = injectedMySql
    return  {
        sendMail: sendMail
    }
}
const sendMail = (mail) => {
    return new Promise((resolve,reject) => {
        loadTemplate(mail.templateId, mail.languageId)
        .then(data => {
            const mailserver = {
                host: "something.com",
                port: 465,
                secure: true, // use TLS
                auth: {
                    user: "something@something.com",
                    pass: "PASSWORD"
                },
                tls: {
                    // do not fail on invalid certs
                    rejectUnauthorized: false
                }
            };
            const body = {
                from: 'something@something.com',
                to: mail.toAdress,
                subject: allReplace(data.subject, mail.subjectReplace),
                text: allReplace(data.body, mail.textReplace),
                html: allReplace(data.html, mail.htmlReplace)
            }
            // create a nodemailer transporter using smtp
            let transporter = nodemailer.createTransport(mailserver)
            transporter.sendMail(body)
            .then(data => {console.log(data)
                resolve(data)
            })
            .catch(err => {reject("sendMail problem")})
        })
        .catch(error => {reject({"error": error, "foo": "bar"})})
    })
}
function allReplace (str, obj) {
    var retStr = str;
    for (var x in obj) {
        retStr = retStr.replace(new RegExp(x, 'g'), obj[x]);
    }
    return retStr;
};
const loadTemplate = (mailTemplate, languageId) => {
    return new Promise((resolve,reject) => {
        if(mailTemplate === null || languageId === null)
            reject("nop, something is missing");
        else
        {
            if (typeof conDB.query === "function")
            {
                conDB.query('SELECT * FROM email_template WHERE language_id = ? AND template_id = ?', [mailTemplate,languageId])
                .then(data => {resolve(data)})
                .catch(err => {reject("mysql has a problem")})
            }
            else
            {
                reject("function is not available");
            }
        }
    })
}
Here is my mysql.js file:
var mysql = require('mysql2/promise');
const databaseConfigs = {
    host: 'localhost',
    user: 'USERNAME',
    password: 'PASSWORD',
    database: 'DBNAME'
};
const createID = table  => {
    return new Promise((resolve,reject) => {
        //execute the query to register the user
        let query = '';
        let id = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)
        query = `SELECT * FROM ${table} WHERE id = ?`
        this.query(query,[table,id])
        .then(data => {
            console.log(data[0].length)
            if(data[0].length==0)
            {
                resolve(id)
            }
            else
            {
                createID(table)
                .then(data => {resolve(data)})
                .catch(error => {reject(error)})
            }
        })
        .catch(error => {reject(error)})
    })
}
async function query (sql,att) {
    let connection = await mysql.createConnection(databaseConfigs);
    return new Promise( ( resolve, reject ) => {
        console.log(`Query: '${sql}'`);
        connection.query(sql,att)
        .then(data => {resolve(data)})
        .catch(error => {reject(error)})
        connection.end();
    });
}
async function transaction(queries, queryValues) {
    if (queries.length !== queryValues.length) {
        return Promise.reject(
            'Number of provided queries did not match the number of provided query values arrays'
        )
    }
    const connection = await mysql.createConnection(databaseConfigs)
    try {
        await connection.beginTransaction()
        const queryPromises = []
        queries.forEach((query, index) => {
            queryPromises.push(connection.query(query, queryValues[index]))
        })
        const results = await Promise.all(queryPromises)
        await connection.commit()
        await connection.end()
        return results
    } catch (err) {
        await connection.rollback()
        await connection.end()
        return Promise.reject(err)
    }
}
module.exports.transaction = transaction;
module.exports.query = query;
module.exports.createID = createID;
Thanks to you all!
Chris
 
    