【问题标题】:Expressjs: Open view after foreach with mysql result.Expressjs:在 foreach 之后使用 mysql 结果打开视图。
【发布时间】:2016-03-24 12:30:48
【问题描述】:

我正在尝试循环使用 mysql 查询的结果并在该循环中执行新查询。遍历结果后,我想用第一个和第二个查询的结果打开一个新视图。

现在我的问题:循环 al 工作,我可以打开新视图,但是当打开视图时,我只得到第一个查询的结果和第二个查询的一部分,它在运行第二个查询之前打开视图另一个时间。

我的代码:

 function getActivitiesDate(req,res, rows)
 {
var rows2 = [];
rows.forEach(function getoutput(item) {
    console.log("getActivitiesDate openend");
    connectionpool.getConnection(function(err, connection3) {
        console.log('Trying to connect to activities date');
        if (!err) {
            console.log('Trying to execute query for activities now'),
                connectionpool.query('SELECT * FROM CALENDAR_ACTIVITY WHERE ACTIVITY_ID =' + connection3.escape(item.ACTIVITY_ID),
                    function (err, rows2) {
                        if (err) {
                            console.error(err);
                            res.statusCode = 500;
                            res.send({
                                result: 'error',
                                err: err.code
                            });
                            connection3.release();
                            console.log('It doesnt work error 500');
                        }
                        if (rows2.length == 0) {
                            res.render('index', {title: 'Index - Calendar Activity not found'});
                        }
                        console.log('Show activities + dates');



                      //  connection3.release();
                    });
        } else {
            console.error('CONNECTION error: ', err);
            res.statusCode = 503;
            res.send({
                result: 'error',
                err: err.code
            });
            console.log('It does not work...');
        }
    });

});
console.log('This is the result of rows2Result: ');
console.log(rows2);
res.render('viewUserActivities', {activities:rows, activityDates:rows2 , title: 'Created activities'});

}

“rows”属性目前包含 2 行(这可能更多或更少,这就是我有“rows.forEach”的原因)但我不确定如何将“rows2”的结果传递给通过 foreach 循环为每个结果循环后的新视图。

任何帮助将不胜感激。我不清楚,或者您需要更多信息,请不要犹豫。

【问题讨论】:

    标签: mysql express foreach pug


    【解决方案1】:

    我没有足够的代表发表评论,所以我可能会误解这个问题,但你能在 forEach 回调完成后渲染视图吗?

    像这样:

    function getActivitiesDate(req,res, rows)
    {
    var rows2 = [];
    rows.forEach(function getoutput(item) {
    console.log("getActivitiesDate openend");
    connectionpool.getConnection(function(err, connection3) {
        console.log('Trying to connect to activities date');
        if (!err) {
            console.log('Trying to execute query for activities now'),
                connectionpool.query('SELECT * FROM CALENDAR_ACTIVITY WHERE ACTIVITY_ID =' + connection3.escape(item.ACTIVITY_ID),
                    function (err, rows2) {
                        if (err) {
                            console.error(err);
                            res.statusCode = 500;
                            res.send({
                                result: 'error',
                                err: err.code
                            });
                            connection3.release();
                            console.log('It doesnt work error 500');
                        }
                        else if (rows2.length == 0) {
                            res.render('index', {title: 'Index - Calendar Activity not found'});
                        } else {
                              console.log('This is the result of rows2Result: ');
                              console.log(rows2);
                            res.render('viewUserActivities', {activities:rows, activityDates:rows2 , title: 'Created activities'});
                        console.log('Show activities + dates');
    
                        }
    
                      //  connection3.release();
                    });
        } else {
            console.error('CONNECTION error: ', err);
            res.statusCode = 503;
            res.send({
                result: 'error',
                err: err.code
            });
            console.log('It does not work...');
        }
    });
    

    【讨论】:

    • 嗨,是的,这行得通。但是我没有从第二个查询中得到所有结果,因为它只执行一次查询,然后打开新视图。但是我需要为每个“项目”执行查询并在循环完成后渲染视图,以便我得到所有结果。如果我尝试您的解决方案,我只会在我的 foreach 中获得第一行的结果。是不是更清楚了?
    • 在这种情况下,我强烈建议使用 Promise 将操作推迟到循环完成。 q 库是一个流行的选择,我认为 this link 作为示例有点相关。否则,您可以使用 async 库并查看它们的循环函数,例如 while 或 until。
    • 如果您不想使用任何外部库,也许您也可以在每个 forEach 循环的回调中调用外部函数。这个外部函数可以等到它被调用 rows2.length 次,在最后一次调用时,它将对所有完成的项目执行 res.render。我认为这种方法可能不太理想。
    • 您好,感谢您的回复。这已经帮了很多忙,但是现在我还有一个问题,如何将第二个查询的结果“添加”到 rows2 而不是在循环中覆盖它?我知道我可以将它推送到一个数组,但是我总是在开头和结尾得到额外的括号“[”。感谢您的帮助,我对此很陌生,在网上找不到太多帮助。
    • 听起来推动它是正确的方法。当你说你在开头和结尾有额外的括号时,我不太清楚你的意思。我倾向于认为第二个查询返回一个包含单个元素的数组,当你将它推入你的 rows2 数组时,它会产生一个数组数组,例如[[1],[2],[3],[4]]。如果是这种情况,那么您可以在推送之前从第二个查询数组中提取数据,例如rows2.push(result[0])
    猜你喜欢
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 2014-09-24
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多