Express.js中POST登录请求成功后发送文件时出现Cannot GET /login错误
Express.js中POST登录请求成功后发送文件时出现Cannot GET /login错误
嘿,我来帮你排查下这个问题~你遇到的情况主要有两个关键点需要解决,一个是代码里的变量冲突问题,另一个是路由请求方式的误解导致的Cannot GET /login提示。
首先说最核心的变量名冲突问题,这会导致你根本无法正确验证用户的登录信息:
你在代码外层定义了var acc = {}来存储用户提交的用户名和密码,但在fs.readFile的回调函数里又用let acc = JSON.parse(jsonData)重新定义了同名变量——这会直接覆盖外层的acc!所以后面验证循环里的acc.username和acc.password,其实是从storage.json读出来的对象的属性(而这个对象只有accs数组,根本没有username和password字段),你的验证条件永远成立不了,authenticated一直是false,自然永远只会返回"fail"。
解决这个问题很简单,把回调里的变量名改个名字就行,比如改成storedAcc:
app.post('/login', function (req, res) { var acc = {}; var data = req.body; acc.username = data.username; acc.password = data.password; fs.readFile('storage.json', (err, jsonData) => { if (err) throw err; // 修改变量名,避免覆盖外层存储用户提交数据的acc let storedAcc = JSON.parse(jsonData); let authenticated = false; for(var i=0; i<storedAcc.accs.length; i++){ // 这里用外层的acc取用户提交的账号密码,和存储的账号对比 if(storedAcc.accs[i].username == acc.username && storedAcc.accs[i].password == acc.password){ authenticated = true; break; } } if(authenticated){ res.sendFile(path.join(__dirname, '/public/homepage.html')); } else { res.send("fail"); } }); });
接下来是Cannot GET /login的问题:
这个提示说明浏览器向/login发送了GET请求,但你只定义了POST方式的/login路由,Express找不到对应的处理逻辑,就返回了404错误。
常见的触发场景有两种:
- 你直接在浏览器地址栏输入
/login,这默认是GET请求,而你没有写处理GET请求的/login路由; - 登录成功后,浏览器地址栏会变成
/login(因为是POST请求的响应),如果此时你刷新页面,部分浏览器可能会误发GET请求到/login。
所以建议你补充一个GET方式的/login路由,用来显示登录表单:
app.get('/login', function(req, res) { // 这里返回你的登录表单页面 res.sendFile(path.join(__dirname, '/public/login.html')); });
另外还有两个小细节要注意:
- 别忘了引入
path模块,还要解析表单数据,否则req.body会是undefined:
const path = require('path'); const fs = require('fs'); const express = require('express'); const app = express(); // 解析urlencoded格式的表单数据 app.use(express.urlencoded({ extended: true }));
- 确认
homepage.html的路径是对的,确保__dirname + '/public/homepage.html'这个路径下确实存在该文件。
备注:内容来源于stack exchange,提问作者Toucdev
相关产品推荐
相关产品推荐

