我在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, function(error, rows) { /* Add selected data to previous saved data. */ } }); res.render('student', {data: /* data from both queries above */}); });
正如我在注释块中所写的那样,我想执行以下操作:首先执行选择查询,保存来自 行 对象的数据,执行第二个查询,再次将接收到的数据保存在其他对象中,然后最终呈现来自两个查询的传递数据的页面。我的问题是,最好的方法是什么?
我知道有一个由匿名函数引起的问题。我试图解决这个问题超过五个小时,如下所示:
我还有一个想法来创建 学生 页面的“子页面” containig部分,这些部分仅需要来自一个查询的变量。另一个想法是使用 db , req , res 或 app 对象的其他一些功能。但是,正如我之前所说,我是Express的新手,我不知道如何实现上述想法。
请注意,不可能联接表-实际上,我想进行4-5个查询,然后呈现我的视图。我正在使用SQLite3数据库。
非常感谢您的帮助!希望您能帮助我解决我的问题。
在您的情况下,我会将数据库调用分成多个单独的调用,并利用next中间件功能。
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对象上。
/student
findStudent
findGroups
renderStudentsPage
希望这会有所帮助,这里是更多信息:http : //expressjs.com/guide/using- middleware.html
编辑/注释:
我之前没有提到它,但是如果在调用时传递参数next(),则会触发错误处理状态。约定表明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(); }); }
然后在代码的其他地方,您可以处理呈现错误页面。