我在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
中间件功能。
它看起来像:
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();
});
}
然后在代码的其他地方,您可以处理呈现错误页面。
渲染某个变量 假定我们定义了一个变量: <script> export default { data () { return { my_value: '默认值', } }, } </script> 我们就可以这样来显示它: <div>{{my_value}}</div> 方法的声明和调用 声明一个方法: show_my_value <script> ex
我现在在大学学习数据库,在我的项目中,我有3个表:、和 联赛(leagueId,leagueName) 团队(teamId,teamName) 具有(leagueId,teamId,year)
Blade 内部内置了一个非常简单的模板渲染引擎,如果你有一些简单的页面需要渲染可以试试它(生产环境不适用)。 渲染一个模板需要遵守一条准则: 所有的模板文件都存储在 resources/templates 目录下 你可以调用 Response 方法的 render 方法渲染或者返回一个 String 类型的视图路径。 @GetRoute("/index") public void renderI
因为新版的控制器可以无需继承任何的基础类,因此在控制器中如何使用视图取决于你怎么定义控制器。 模板渲染 渲染模板最常用的是控制器类在继承系统控制器基类(\think\Controller)后调用fetch方法,调用格式: fetch('[模板文件]'[,'模板变量(数组)']) 模板文件的写法支持下面几种: 用法 描述 不带任何参数 自动定位当前操作的模板文件 [模块@][控制器/][操作] 常用
问题内容: 我的Node.js服务器的外观如下所示: 这是一个包含PNG图像的Base64表示形式的字符串。有什么方法可以将其发送给客户端,该客户端访问编码并显示为图像的路由(例如,可以在标记中使用URL )? 问题答案: 是的,您可以对base64字符串进行编码,然后将其作为图像返回给客户端:
问题内容: 将SELECT查询放在UPDATE查询的WHERE子句中时出现错误。 我的查询是这样的: AND错误将显示如下: “无法在FROM子句中指定目标表’m’进行更新” 问题答案: 实际上,您可以通过将其包装在子查询中来更新它(从而为结果创建临时表) 或使用 JOIN