razlevy
razlevy

Reputation: 35

Node JS MySQL wait for results

I'm quite new to Node JS, and I'm trying to build an API based on MySQL.
In one of my routers I'm trying to inject an insert query and based on it, get the new generated task id from mysql.
The problem is that the second query is not waiting for the response and sometimes I'm getting an error because taskId variable is undefined because it still didn't get the results from the first query.
the problematic variable that is not getting it's value correctly is taskId.
I'm attaching my code for your review, thanks for your help!
As requested: I'm attaching my required moudle as well:

const dotenv = require('dotenv');
const mysql = require('mysql');

dotenv.config();

var connection = mysql.createPool({
    host: process.env.DB_HOST,
    user: process.env.DB_USERNAME,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_TABLE,
    port: process.env.DB_PORT
});

module.exports = connection;
router.post('/new', auth, async (req, res) => {
    const uid = req.body.uid;
    const taskName = req.body.taskName;
    const description = req.body.description;
    const createdDate = req.body.createdDate;
    const estimatedDate = req.body.estimatedDate;
    const status = req.body.status;
    let taskId = '';
    addTaskQuery = `INSERT INTO task (title,description,status) VALUES ('${taskName}','${description}','${status}')`;
    findTaskIdQuery = `SELECT id FROM task WHERE title = '${taskName}'`;
    try {
        // Injecting into task table
        await connection.query(addTaskQuery, (err, results) => {
            if(err) {
                console.log(err);
                return res.send(JSON.stringify({data: err}));
            }
        })
        // Getting the new inserted task id
        await connection.query(findTaskIdQuery, (err, results) => {
            if(err) {
                console.log(err);
                return res.send(JSON.stringify({data: err}));
            }
            taskId = JSON.stringify(results[0].id);
        })
        // Injecting into havetask table
        await connection.query(`INSERT INTO havetask (id,userId,taskId) VALUES (${taskId},${uid},${taskId})`, (err, results) => {
                    if(err) {
                        console.log(err);
                        return res.send(JSON.stringify({data: err}));
                    }
        })
    }
    catch(err) {
        console.log(err);
        return res.status(401).json({ msg: 'An error occured while tried to add task'});
    }
})

Upvotes: 0

Views: 529

Answers (1)

O. Jones
O. Jones

Reputation: 108641

The mysql package you use does not support Promises (=== it doesn't do async / await). So your await statements don't wait, they just fall through.

You need to try a package that handles async / await. This one might do the trick.

Upvotes: 1

Related Questions