Dom Needham
Dom Needham

Reputation: 69

Need data from promise in chain

I have a promise for getting data from a mysql database using mysql2 on express. I need to get data from the first query into the final returned object after running another query.

db.query("SELECT * FROM users_tasks_link WHERE uin = ?", [req.params.id])
        .then(result => {
            const foo = db.query(
                "SELECT * FROM tasks WHERE id IN (?); SELECT * FROM headers; SELECT * FROM categories; SELECT * FROM links",
                [
                    result[0].map(e => {
                        return e.task_id;
                    })
                ]
            );
            return foo;
        })
        .then(foo => {
            let tasks = [];
            foo[0][0].forEach(element => {
                let task = {
                    id: element.id,
                    title: element.title,
                    header: foo[0][1].filter(e => element.header === e.id)[0].header,
                    category: foo[0][2].filter(e => element.category === e.id)[0].category,
                    notes: element.notes,
                    level: element.level,
                    links: foo[0][3]
                        .filter(e => element.id === e.task_id)
                        .map(el => {
                            return {
                                name: el.name,
                                link: el.link
                            };
                        })
                };

                tasks.push(task);
            });
            return res.send({ data: tasks, message: "Got all tasks for user" });
        })
        .catch(err => {
            console.log(err);
        });

I need a value from "result" in the tasks object, but I can't access the result data from "foo".

Upvotes: 1

Views: 45

Answers (1)

silencedogood
silencedogood

Reputation: 3299

Create a variable higher in scope before calling db.query. And store the results in it to be referenced later:

var datavar;

db.query("SELECT * FROM users_tasks_link WHERE uin = ?", [req.params.id])
    .then(result => {
        datavar = result;
        const foo = db.query(
            "SELECT * FROM tasks WHERE id IN (?); SELECT * FROM headers; SELECT * FROM categories; SELECT * FROM links",
            [
                result[0].map(e => {
                    return e.task_id;
                })
            ]
        );
        return foo;
    }).then(foo => { // You can now use datavar to access the data you want }

Upvotes: 2

Related Questions