首页 > 解决方案 > 获取 MySQL 和 EXPRESS 时出现异步问题

问题描述

我正在尝试在对象中简单地添加一个新属性。正在从我的数据库中获取 objs 数组,然后我尝试添加一个也从我的数据库中获取的属性。虽然当我尝试操纵它时,我收到“未定义”。

这些是目前围绕在我脑海中的问题。

代码:

exports.getIndex = (req, res, next) => {

    Report.fetchAll().then(([rows, fieldData]) => {

        // console.log(rows);
        const modifiedRows = rows.map(el => {

            Report.fetchUserNameOfReport(el.UserInfo_idPessoa).then(([rows, fieldData]) => {
                console.log(rows);
                return {
                    ...el,
                    userOfReport: 'Joao' //change later to smthing like rows.name
                };
            }).catch(err => console.log(err));
            // return{
            //     ...el,
            //     userOfReport: 'Joao'
            // };

        });

        res.render('user/index', { reports: rows, pageTitle: 'Social Reporter', path: '/' });
    }).catch(err => console.log(err));

};

Obs 如果将其注释掉并注释 Report.fetchUserNameOfReport 函数,则此方法有效->

        // return{
        //     ...el,
        //     userOfReport: 'Joao'
        // };

预期结果:

  {
    idComplaint: 83059,
    title: '4444',
    description: '4444',
    image: '4444',
    location: '4444',
    UserInfo_idPessoa: 80068,
    userOfReport: 'Joao'
  }

实际结果:

undefined

先感谢您!

标签: mysqlnode.jsexpressobject

解决方案


你永远不会在你的 中返回任何东西.map,所以所有的值modifiedRows都会是undefined。您可以将它们全部映射到 Promise 以获取所有值,然后在等待所有 Promise 解决后访问修改后的行。此外,您通过多次声明rows和隐藏变量:fieldData

exports.getIndex = (req, res, next) => {

    Report.fetchAll().then(([rows, fieldData]) => {

        // console.log(rows);
        const modifiedRowPromises = rows.map(el => {
            return Report.fetchUserNameOfReport(el.UserInfo_idPessoa).then(([rows2, fieldData2]) => {
                console.log(rows2);
                return {
                    ...el,
                    userOfReport: 'Joao' //change later to smthing like rows2.name
                };
            });
        });

        Promise.all(modifiedRowPromises).then(modifiedRows => {
            res.render('user/index', { reports: modifiedRows, pageTitle: 'Social Reporter', path: '/' });
        }).catch(console.log);
    }).catch(err => console.log(err));
};

或者,如果你使用async/await语法,这可以更干净地实现:

exports.getIndex = async (req, res, next) => {
    try {
        const [rows, fieldData] = Report.fetchAll();

        const modifiedRowPromises = rows.map(async el => {
            const [rows2, fieldData2] = await Report.fetchUserNameOfReport(el.UserInfo_idPessoa);
            return {
                ...el,
                userOfReport: 'Joao' //change later to smthing like rows2.name
            };
         });

         const modifiedRows = await Promise.all(modifiedRowPromises);
         res.render('user/index', { reports: modifiedRows, pageTitle: 'Social Reporter', path: '/' };
    } catch (err) {
        console.log(err);
    }
};

推荐阅读