我最近选择了一个拥有开发团队的客户。我正在开发一个已经开发的网站,并且遇到了一些对我来说有点奇怪的事情。
我总是认为在路由处理中混淆请求对象实际上很糟糕(我在这里可能完全错了)。
下面的代码让我感到困惑,因为我不确定他们为什么要将req.query.msg分配给某个东西,而不是仅仅创建一个变量并在ejs页面渲染上传递它。
/********************************************************
* *
* CHANGE PASSWORD ROUTE THAT POSTS THE NEW PASSWORD TO *
* DATABASE. *
* *
********************************************************/
app.post('/client/password', function (req, res) {
var url = URLS.ClientChangePW;
if(req.session.securityquestions[0].SSN !== "null" || req.session.securityquestions[0].SSN !== "undefined"){
if(req.body.pwd !== req.body.pwdconf){
res.redirect('/client/changePassword' + config.PWD_MISMATCH);
} else {
var ssn = req.session.securityquestions[0].SSN;
while(ssn.length < 9){
ssn = "0" + ssn;
}
url = url.replace("@ssn", ssn);
url = url.replace("@newpw", req.body.pwd);
}
request.put(url, function (err, xres, body) {
var data = JSON.parse(body);
if(data.status === 200){
email(req.session.securityquestions[0].EMAIL, "none", "forgotpw", function(result){
if(result){
req.query.msg = "Your password has been reset.";
} else {
req.query.msg = "Request unsuccessful. Please call number here for assistance.";
}
res.render('pages/login', {
session: req.session,
msg: req.query.msg
});
});
} else {
req.query.msg = "Request unsuccessful. Please call number here for assistance.";
res.render('pages/login', {
session: req.session,
msg: req.query.msg
});
}
});
}
});
同样,我从未真正搞过req对象,所以我可能错了。我一直认为客户端设置了请求,我们使用它来发送响应。
答案 0 :(得分:1)
我不确定他们为什么要将req.query.msg分配给某个东西而不是仅仅创建一个变量并在ejs页面渲染上传递它。
这里似乎没有任何理由分配给req.query.msg
属性。如果这是我的代码,我将使用一个单独的局部变量。
同样,我从未真正搞过req对象,所以我可能错了。我一直认为客户端设置了请求,我们使用它来发送响应。
虽然这不是这里发生的事情,但在Express开发中常见的是使用中间件在req
对象上为请求处理程序设置状态,以便在路由堆栈中使用。 req
对象是规范对象,您在处理请求时保持特定于请求的状态。如果您只有一个请求处理函数处理请求,那么没有理由将状态放在req
对象上,因为您可以在该请求处理函数中使用局部变量。但是,如果您正在使用中间件,其工作是在最终到达请求处理程序之前进行设置,那么req
对象就是通常放置该设置状态的位置。您会注意到此代码中也使用了req.session
。请求处理中的某些中间件将.session
属性放在那里。
因此,在使用中间件时,通常会向req
对象添加状态。但是,在您显示的代码中的.msg
属性示例中,没有特别的理由将其放在req
对象上,因为它的值仅在本地函数中需要,因此它可以很容易(而且我会更清楚地说明是在一个局部变量中。