【问题标题】:Need data from promise in chain需要链中承诺的数据
【发布时间】:2019-09-10 21:46:39
【问题描述】:

我承诺使用 mysql2 on express 从 mysql 数据库中获取数据。运行另一个查询后,我需要将第一个查询中的数据获取到最终返回的对象中。

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);
        });

我需要任务对象中“结果”的值,但无法访问“foo”中的结果数据。

【问题讨论】:

    标签: mysql node.js express node-mysql2


    【解决方案1】:

    在调用 db.query 之前创建一个更高范围的变量。并将结果存储在其中以供以后引用:

    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 }
    

    【讨论】:

    • 如此简单,但它确实有效!谢谢你。不确定它是否被认为是“最佳实践”。
    • @DomNeedham 好吧,如果这被认为是不好的做法,我目前不知道 :) 虽然谁知道,但也许有人有一些我还没有看到的更好的解决方案。不用说,我认为你很安全。
    猜你喜欢
    • 2020-09-10
    • 2017-11-27
    • 1970-01-01
    • 2018-04-17
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    相关资源
    最近更新 更多