关于#javascript#的问题:其中getVerify.js文件内包含下述代码,我想要通过调用到login来实现登录(相关搜索:服务器)

代码都部署在服务器上。如下代码中是用户登录功能的实现


<script>
    function login() {
        var username = document.getElementById("username").value;
        var password = document.getElementById("password").value;
        var xhr = new XMLHttpRequest();
        xhr.open('GET', 'http://xxx.xx.xxx.xx:xx/html/html/login/getVerify.js', true);
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
    
        alert(xhr.responseText);
                var data = JSON.parse(xhr.responseText);
                flag = false
                for (var i = 0; i < data.length; i++) {
                    if (data[i].username === username && data[i].password === password) {
                        flag = true
                        break;
                    }
                }
                if (flag) {
                    alert('登陆成功!')
                    window.location.href = 'index.html';

                } else {
                    alert('用户名或密码错误,请重试!')
                }
            }
        };
        xhr.send();
    }
    function register(){
        window.location.href='register.html'
        // window.location.href='login.html'
    }
</script>

其中getVerify.js文件内包含下述代码,我想要通过调用到login来实现登录,


```javascript
app.get('/login', (req, res) => {
    const sql = 'SELECT * FROM username_password';
    console.log(sql)

    connection.query(sql, (error, results, fields) => {
        if (error) {
            res.status(500).send(error);
            return;
        }
        res.json(results);
    });
});

目前错误出现在第一段代码的 var data = JSON.parse(xhr.responseText);这里,我通过alert打印输出发现返回的是整个getVerify.js文件,而不是数据库中的用户名密码json格式。这些代码在本地是运行正常的,,然后我把ip地址换成服务器地址放到服务器上就出现了问题,
感觉错误是在xhr.open('GET', 'http://地址/html/html/login/getVerify.js', true);这里没有请求/login路由,但是不知道怎么改

引用 皆我百晓生 小程序回复内容作答:
根据你提供的描述,问题出现在以下代码段:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://xxx.xx.xxx.xx:xx/html/html/login/getVerify.js', true);
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
        alert(xhr.responseText);
        var data = JSON.parse(xhr.responseText);
        // ...
    }
};
xhr.send();

问题可能是由于你请求了错误的 URL 导致的。根据你的描述,你正在尝试获取 getVerify.js 文件的内容,然而,你将该地址作为 AJAX 请求的 URL。这将导致 xhr.responseText 返回的是 getVerify.js 文件的内容,而不是你期望的从服务器返回的用户名和密码的 JSON 格式数据。

解决方法是将 AJAX 请求的 URL 修改为登录路由的 URL,即 /login

修改后的代码如下所示:

var xhr = new XMLHttpRequest();
xhr.open('GET', '/login', true); // 修改为登录路由的 URL
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
        var data = JSON.parse(xhr.responseText);
        // ...
    }
};
xhr.send();

这样,当你调用 login() 函数时,它将向 /login 发送 AJAX 请求,获取服务器返回的用户名和密码数据,并继续处理后续逻辑。希望这能解决你的问题!

把错误报错截图处理看看

你的前端代码中使用XMLHttpRequest尝试获取getVerify.js文件,但是您的getVerify.js文件中实际上包含了一个Express路由,该路由用于处理登录验证。这个结构是不合适的。如果您希望通过调用login函数实现用户登录,您不应该将登录验证的Express路由放在一个JavaScript文件中,而是应该将登录验证的后端逻辑集成到服务器的路由中,然后在前端代码中使用XMLHttpRequest或其他HTTP请求库来向服务器发送登录请求。
以下是一种可能的修改方法:

在服务器端(Node.js Express)中创建一个用于处理登录请求的路由:

const express = require('express');
const app = express();
const port = 3000; // 您的服务器端口

// 添加一个路由用于处理登录请求
app.get('/login', (req, res) => {
    const username = req.query.username; // 通过查询参数获取用户名
    const password = req.query.password; // 通过查询参数获取密码
    
    // 连接数据库并执行登录验证逻辑
    // 在这里查询数据库,验证用户名和密码是否匹配
    // 如果匹配成功,可以向客户端发送一个成功响应,否则发送失败响应
    // 这里是一个简化的示例:
    if (username === '正确的用户名' && password === '正确的密码') {
        res.json({ success: true });
    } else {
        res.json({ success: false });
    }
});

app.listen(port, () => {
    console.log(`服务器运行在 http://localhost:${port}`);
});


在前端代码中,修改login函数以使用XMLHttpRequest向服务器发送登录请求:

function login() {
    var username = document.getElementById("username").value;
    var password = document.getElementById("password").value;
    var xhr = new XMLHttpRequest();
    
    // 修改请求地址为服务器端的/login路由
    xhr.open('GET', `http://xxx.xx.xxx.xx:xx/login?username=${username}&password=${password}`, true);
    
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4) {
            if (xhr.status === 200) {
                var response = JSON.parse(xhr.responseText);
                if (response.success) {
                    alert('登录成功!');
                    window.location.href = 'index.html';
                } else {
                    alert('用户名或密码错误,请重试!');
                }
            } else {
                alert('登录请求失败,请检查服务器连接。');
            }
        }
    };
    xhr.send();
}


这样,前端代码将通过XMLHttpRequest向服务器的/login路由发送用户名和密码,并且服务器将根据提供的用户名和密码进行验证。如果验证成功,服务器将返回一个成功的响应,否则将返回一个失败的响应,然后前端代码可以根据响应来处理用户登录的结果。

原因有以下几点:

  1. 服务器上的 /login 路径没有被正确映射到 getVerify.js 文件。你需要确认你的服务器配置是否正确,使得对该路径的请求能够正确地返回 getVerify.js 文件的内容。
  2. 在服务器上,你的 /login 路由可能没有被正确地处理。在使用 Node.js 和 Express 的情况下,你需要确保你的 app.get('/login') 路由是正确的,并且它能够正确地查询数据库并返回 JSON 结果。
  3. 你的 XMLHttpRequest 的请求是异步的,如果在请求返回前浏览器已经加载了整个 getVerify.js 文件,那么你可能会获取到该文件的全部内容,而不是从服务器获取的 JSON 数据。
    要解决这个问题,你可以尝试以下步骤:
  4. 使用浏览器开发者工具检查请求的 HTTP 状态码和响应内容,以确定是否有错误发生。
  5. 检查服务器端的 /login 路由处理程序,确保它能正确地查询数据库并返回 JSON 数据。
  6. 考虑使用 fetch 或者 axios 这样的库来发送 HTTP 请求,因为它们提供了更现代、更易于控制的接口。例如,你可以使用 fetch 或 axios 发送一个 GET 请求到 '/login' 路由,并从响应中获取 JSON 数据。

援引讯飞星火:
你需要将xhr.open('GET', 'http://xxx.xx.xxx.xx:xx/html/html/login/getVerify.js', true);中的URL改为正确的服务器地址和端口,同时确保服务器已经正确配置了路由。你可以尝试以下修改:

xhr.open('GET', 'http://xxx.xx.xxx.xx:xx/html/html/login/getVerify.js', true);

修改为:

xhr.open('GET', '/html/html/login/getVerify.js', true);

这样,你的请求将会发送到服务器的根路径,然后根据相对路径找到getVerify.js文件。请确保服务器已经正确配置了路由,以便能够正确处理这个请求。

根据你提供的信息,可以看出问题出在xhr.open函数中对url的设置上。目前的设置是请求getVerify.js文件,而不是请求/login路由获取数据库中的数据。要解决这个问题,需要将xhr.open函数中的url修改为请求/login路由,如下所示:

xhr.open('GET', 'http://地址/login', true);

这样就可以正确请求/login路由获取数据库中的数据了。

从错误截图来看的话是,语法错误,直接找人远程,这么看不容易看出来,还有你说本地是可以的,放到服务器不行,就是参数配置没配置好!
根据你提供的代码,可能问题出在这个请求地址 'http://xxx.xx.xxx.xx:xx/html/html/login/getVerify.js' 上。你可以尝试修改请求地址为 '/login',即对应服务器端的 '/login' 路径,确保前后端请求的是同一个接口。

另外,你也可以在服务器端输出一下获取到的数据,确保数据确实是从数据库中获取的,而不是其他文件。例如可以在服务器端的路由代码中添加一行 console.log(results),检查是否获取到了正确的数据。

最后,确保你的服务器端配置允许跨域请求,否则客户端可能无法正常请求到服务器端的数据。可以在服务器端添加如下中间件解决跨域问题:

app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
});

该回答引用ChatGPT,希望对题主有所帮助,如有帮助,还望采纳。


根据您提供的信息,第一段代码中的xhr.open()方法应该将URL改为请求/login路由,而不是getVerify.js文件,因为getVerify.js文件似乎不包含需要的JSON数据。

所以需要修改成:

xhr.open('GET', 'http://xxx.xx.xxx.xx:xx/login', true);

这样就会请求/login路由,从而获取与获取用户名和密码相关的JSON数据。

另外,确认一下数据库中的表名和字段名是否正确。如果表名或字段名不正确,也会导致JSON数据无法正确获取。

【以下回答由 GPT 生成】

<script>
function login() {
    var username = document.getElementById("username").value;
    var password = document.getElementById("password").value;
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://xxx.xx.xxx.xx:xx/html/html/login/getVerify.js', true);
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
            var data = JSON.parse(xhr.responseText);
            var flag = false;
            for (var i = 0; i < data.length; i++) {
                if (data[i].username === username && data[i].password === password) {
                    flag = true;
                    break;
                }
            }
            if (flag) {
                alert('登陆成功!');
                window.location.href = 'index.html';
            } else {
                alert('用户名或密码错误,请重试!');
            }
        }
    };
    xhr.send();
}
function register(){
    window.location.href='register.html';
    // window.location.href='l
}
</script>

请将上述代码插入到HTML文件的合适位置,确保<script>标签被正确包围,并确保该代码被正确调用。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

结合GPT给出回答如下请题主参考
抱歉,你提供的代码不完整,无法给出具体的解答。可以补充完整的代码并说明具体问题,这样我才能帮助你更好地解决问题。

使用javascript实现简易登录功能

新建一个js文件(我这里取名为Signin.js),定义两个变量,用户名和密码,使用从网页中输入的参数进行赋值,之后进行if判断语句,如果输入的用户名和密码都匹配正确则弹窗登陆成功,并且进入指定网页,如果用户名或者密码不正确,则弹窗用户名或密码错误,如果用户名未输入,则弹窗用户名不能为空,如果密码未输入,则弹窗密码为空,js代码如下(复制可直接使用):

function login() {
        
            var userName = document.getElementById("nName").value;
            var userPass = document.getElementById("uPass").value;
            
            if (userPass == "123456" && userName == "root") {
                alert("登入成功");
                window.location.href="index.html";
            } 
            else if (userName == "" || userName == null) {
                alert("用户名不能为空");
                return false;
            } 
            else if (userPass == "" || userPass == null) {
                alert("密码不能为空");
                return false;
            } 
            else if (userPass != "123456" || userName != "mhh") {
                alert("用户名或密码错误");
                return false;
            } 
            else{
                return true;
            }
                
        }

之后在你的html文件中导入该文件

<script src="Signin.js"></script>

html文件中body标签下的登录窗口需要有用户输入栏,我是这样写的(也可直接复制)

<body style="text-align: center;background-image:url('JPG/denglu.jpg');" onLoad="document.getElementById('enter').focus()" οnkeydοwn="if(event.keyCode===13) document.all.enter.click()"><br><br><br><br><br>

#此处导入CSS文件
        <style>
            @import url(denglu.css);
        </style>
        <div style="text-align: center;width: 100%;height: 50px;color: #fff;font-family: '楷体';font-size: 30px;text-shadow: -2px 2px 0 skyblue,2px 2px 0 skyblue,2px -2px 0 skyblue;"><h1>登录</h1></div>
        <div class="content" >
          <div class="login-wrap">
            <form id="user_login" action="">
              <h3 style="font-family: '楷体';">登 录</h3><br>
              账号:<input class="name" name="name" id="nName" type="text" placeholder="请输入用户名" ><br>
              密码:<input class="code" name="password" id="uPass" type="password" placeholder="请输入密码" >
              <div class="btn" onLoad="document.getElementById('enter').focus()">
                <input type="button" id="enter" class="submit" value="登录" οnclick="login()">
                <input type="reset" id="reset" class="reset" value="重置" >
              </div>
                <div id="CheckMsg" class="msg"></div>
            </form>
          </div>
        </div>

</body>
注意:CSS样式需要定义来美化用户页面

我的CSS文件如下:

.content{
    padding:0 auto;
  margin: 0 auto;
  height: 450px;
  width: 100%;
  background-size:100% 450px ;
  margin-top: 25px;
}
.login-wrap{
  position: absolute;
  width:320px;
  height: 300px;
  border-radius: 10px;
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
  right:40%;
  margin-top: 75px;
  background: url("../Image/Login-Img/form_bg.png") no-repeat;
  background-size: 100%;
  border-radius: 25px;
  background-color: #fff;
  opacity: 0.8;
}
.login-wrap h3{
  color:black;
  font-size: 18px;
  text-align: center;
}
.name,.code{
  border:1px solid cyan;
  width:130px;
  height: 40px;
  margin-left: 25px;
  margin-bottom: 20px;
  padding-left: 40px;
  border-radius:12px;
  border-color:skyblue;
}
.name{
  color: black;
  background-position-x:12px;
}
.code{
  color: blue;
  background-position-x:12px;
}
.btn input{
  height: 40px;
  width: 120px;
  float: left;
  margin-right: 25px;
  border:none;
  color:black;
  font-size: 16px;
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
  border-radius: 10px;
  margin-top: 10px;
  cursor: pointer;
}
input:active{border-color:#147a62}
.submit{background: #ea8c37;margin-left: 25px;}
.reset{background: #bbb;}
/**错误信息提醒**/
.msg{
  color: #ea8c37;
  font-size: 14px;
  padding-left: 40px;
  padding-top: 10px;
  clear: both;
  font-weight: bold;
}