在api服务器中更改req对象?

时间:2017-12-23 01:37:49

标签: javascript node.js express

我最近选择了一个拥有开发团队的客户。我正在开发一个已经开发的网站,并且遇到了一些对我来说有点奇怪的事情。

我总是认为在路由处理中混淆请求对象实际上很糟糕(我在这里可能完全错了)。

下面的代码让我感到困惑,因为我不确定他们为什么要将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对象,所以我可能错了。我一直认为客户端设置了请求,我们使用它来发送响应。

1 个答案:

答案 0 :(得分:1)

  

我不确定他们为什么要将req.query.msg分配给某个东西而不是仅仅创建一个变量并在ejs页面渲染上传递它。

这里似乎没有任何理由分配给req.query.msg属性。如果这是我的代码,我将使用一个单独的局部变量。

  

同样,我从未真正搞过req对象,所以我可能错了。我一直认为客户端设置了请求,我们使用它来发送响应。

虽然这不是这里发生的事情,但在Express开发中常见的是使用中间件在req对象上为请求处理程序设置状态,以便在路由堆栈中使用。 req对象是规范对象,您在处理请求时保持特定于请求的状态。如果您只有一个请求处理函数处理请求,那么没有理由将状态放在req对象上,因为您可以在该请求处理函数中使用局部变量。但是,如果您正在使用中间件,其工作是在最终到达请求处理程序之前进行设置,那么req对象就是通常放置该设置状态的位置。您会注意到此代码中也使用了req.session。请求处理中的某些中间件将.session属性放在那里。

因此,在使用中间件时,通常会向req对象添加状态。但是,在您显示的代码中的.msg属性示例中,没有特别的理由将其放在req对象上,因为它的值仅在本地函数中需要,因此它可以很容易(而且我会更清楚地说明是在一个局部变量中。