程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Express中的多个SELECT查询后的渲染视图大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Express中的多个SELECT查询后的渲染视图?

开发过程中遇到Express中的多个SELECT查询后的渲染视图的问题如何解决?下面主要结合日常开发的经验,给出你关于Express中的多个SELECT查询后的渲染视图的解决方法建议,希望对你解决Express中的多个SELECT查询后的渲染视图有所启发或帮助;

在您的情况下,我会将数据库调用分成多个单独的调用,并利用next中间件功能。

它看起来像:

function findstudent(req, res, next) {
    var dbrequest = 'SELECT * FROM students WHERE IDCard = \'' + req.querY['ID'] + '\'';
    db.all(dbrequest, function(error, rows) {
        if(rows.length !== 0) {
            req.students = rows;
            return next();
        }

        res.render('incorrect_student'); /* Render the error page. */            
    });
}

function findGroups(req, res, next) {
    dbrequest = 'SELECT * FROM Groups WHERE name = \'' + req.querY['group'] + '\'';
        db.all(dbrequest, function(error, rows) {
            /* Add SELEcted data to prevIoUs saved data. */
            req.groups = rows;
            next();
        }
    });
}

function renderstudentsPage(req, res) {
    res.render('student', {
        students: req.students,
        groups: req.groups
    });
}

app.get('/student', findstudent, findGroups,  renderstudentsPagE);

当您获得GET时/student,您首先要打电话findstudent。一旦数据库调用完成,它将呈现错误页面,或调用next()。调用next转到下一个函数,findGroups然后调用renderstudentsPage。您可以在向下移动功能行时将数据存储在req对象上。

希望这会有所帮助,这里是更多信息:http ://expressjs.com/guIDe/using- mIDdleware.HTML

编辑/注释:

我之前没有提到它,但是如果在调用时传递参数next(),则会触发错误处理状态。约定表明next()没有参数,除非遇到错误实例。

您希望将uI呈现方面与数据库调用分开,因此,进一步讲,您的代码可能类似于:

function findstudent(req, res, next) {
    var dbrequest = 'SELECT * FROM students WHERE IDCard = \'' + req.querY['ID'] + '\'';
    db.all(dbrequest, function(error, rows) {

        if (error || !rows.length) {
            return next(error);
        }

        req.students = rows;
        return next();
    });
}

然后在代码的其他地方,您可以处理呈现错误页面。

解决方法

在Node.JS和Express框架中有点陌生,并且下面的代码有很大的问题:

app.get('/student',function(req,res) {
    var dbrequest = 'SELECT * FROM students WHERE IDCard = \'' + req.querY['id'] + '\'';
    db.all(dbrequest,function(error,rows) {
        if(rows.length !== 0) {
            /* Save data. */
        }   
        else
            res.render('incorrect_student'); /* Render the error page. */
    });

    dbrequest = 'SELECT * FROM Groups WHERE Name = \'' + req.querY['group'] + '\'';
        db.all(dbrequest,rows) {
            /* Add SELEcted data to previous saved data. */
        }
    });
    res.render('student',{data: /* data from both queries above */});
});

正如我在注释块中所写的那样,我想执行以下操作:首先执行选择查询,保存来自
对象的数据,执行第二个查询,再次将接收到的数据保存在其他对象中,然后最终呈现来自两个查询的传递数据的页面。我的问题是,最好的方法是什么?

我知道有一个由匿名函数引起的问题。我试图解决这个问题超过五个小时,如下所示:

  1. 使用匿名函数将 对象克隆到另一个对象,然后将其传递给 res.render 。此解决方案无效,因为复制的对象的值在此函数外部(仅在函数内部)不可见(未定义)。
  2. 两次渲染 学生 页面-当然,这真的很幼稚。
  3. 更改 db.all 命令 db.prepare 然后 db.run -这是不是工作压力太大。
  4. 通过匿名函数返回对象,然后将其分配给 app.getvar dbrequest 之间定义的外部对象。结果如第一点所述。

还有一个想法来创建 学生 页面的“子页面” containig部分,这些部分仅需要来自一个查询的变量。另一个想法是使用 dbreq
resapp 对象的其他一些功能。但是,正如我之前所说,我是Express的新手,我不知道如何实现上述想法。

请注意,不可能联接表-实际上,我想进行4-5个查询,然后呈现我的视图。我正在使用SQLite3数据库。

非常感谢您的帮助!希望您能帮助我解决我的问题。

大佬总结

以上是大佬教程为你收集整理的Express中的多个SELECT查询后的渲染视图全部内容,希望文章能够帮你解决Express中的多个SELECT查询后的渲染视图所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。