首页 > 解决方案 > Node.JS:如何转发到带参数的登录页面?

问题描述

我正在使用 node.js、express、express-session、ejs 构建登录功能。

这是登录页面(即 index.ejs)

<html>
    <head>
        <meta charset="UTF-8">
        <title>Video Chat Room</title>
        <link rel="stylesheet" type="text/css" href="/css/style.css">
        <style>
            #message
            {
                color:red;
                font-weight: bold;
            }
        </style>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
        <script>
            $( document ).ready(function() {
                var messageBox=document.getElementById("message");
<%
                if  (typeof errorField!="undefined") {
                    switch (errorField) {
                        case "email":%>
                            messageBox.innerHTML="Your email address has been used by another user, please use another one.";
                            document.getElementById("email").focus();
<%                          break;
                        case "logoutSuccess":%>
                            messageBox.innerHTML="<%=alias%> has successfully logged out.";
<%                          break;
                    }
                }
%>              
            });
        </script>   
    </head> 
    <body>
        <form method="post" action="/login">
            Nick name/Alias:<input type=text required name="alias" value="<%=((typeof user=='undefined')?'':user.alias)%>"><br>
            Email Address:<input type=email id="email" required name="email" value="<%=((typeof user=='undefined')?'':user.email)%>"><br>
            <input type="submit" value="Login">
        </form>
        <div id="message">
        </div>
    </body>
</html> 

这是服务器端代码(即 server.js)

........
app.get('/',function (req,res) {
   res.render('../ejs/index.ejs');
});

app.post('/login', function(req, res) {

var alias = req.body.alias;
var email = req.body.email;
var user=require("./classes/user.js");
user.alias=alias;
user.email=email;

if (user.login) {
    req.session.user = user;
    res.redirect('/home/');
} else {
   res.locals.errorField="email";
   res.locals.user=user;
   res.render('../ejs/index.ejs');
}

它工作正常,但是,当登录过程失败时,虽然web输出了登录页面(即index.ejs),但浏览器地址栏仍然停留在“/login”;是否可以将浏览器地址栏更改为“/”并且 index.ejs 也可以读取 errorField 和用户值?

标签: node.jsexpressejs

解决方案


如果您希望用户登录错误返回/,那么您需要这样做res.redirect("/")。如果您想向该页面添加一些可用于服务器端渲染或客户端渲染的参数,那么最简单的方法是添加查询参数:

res.redirect("/?error=email")

然后,您的服务器端呈现或某些客户端 Javascript 可以获取该查询参数并在页面中显示类似消息的内容来解释发生了什么。

有很多方法可以做这样的事情。这是部分列表:

  1. 在服务器端呈现获取的查询参数中发送数据,并向页面添加一些解释性文本。
  2. 在客户端 Javascript 获取的查询参数中发送数据,并向页面添加一些解释性文本。
  3. 设置一个 cookie,其中包含一条错误消息,您的服务器端呈现将在重定向时选择该消息,然后清除 cookie。
  4. 在服务器上的用户会话对象中设置一些错误数据,您的服务器端渲染将在渲染重定向页面并从会话中清除该信息时拾取这些错误数据。
  5. 使用为这些临时消息构建的 Express 中间件模块,称为flash
  6. 从服务器呈现错误页面(没有立即重定向),然后在几秒钟后发生客户端驱动的重定向回“/”。客户端驱动的重定向可以来自<meta>标签,也可以是计时器上的客户端 Javascript。

推荐阅读