Express.js登录/注册路由开发问题:状态码设置与404错误
Express.js 用户认证路由问题及代码排查
问题描述
- 基于Express.js开发登录/注册POST路由,已为登录路由配置200、401状态码,但不清楚如何为注册路由添加对应状态码处理逻辑
- 服务监听3060端口,Chrome访问
localhost:3060时出现Cannot GET /404错误,app.js无语法错误 - 后续需实现logout路由、邮箱正则校验、密码哈希功能
代码片段
app.js
const express = require('express'); const app = express(); const mysql = require('mysql') const port = 3060; // 连接MySQL数据库 const sqlconn = mysql.createConnection({ host: "localhost", email: "coreyjames689@aol.com", password: "dsfsd78df&I*$", name: "Corey James", database: "MyDB", port: 3020 }); sqlconn.connect((err) => { if (err) throw err; console.log("Database connection successful"); }); // 用户注册路由 app.post('/register', (req, res) => { res.status(200).send('Successfully created an account') }); // 用户登录路由 app.post('/login', (req, res) => { const email = 'example@email.com' const password = 'Password123!' if(!email) res.status(401).send('Invalid email') if(!password) res.status(401).send('Invalid password') res.status(200).send('Successful login') }); // 用户登出路由 app.post('/logout', (req, res) => { res.status(200).send('Successfully logged out') }); // 启动服务监听端口 app.listen(port, () => { console.log(`Listening on port ${port}..`); })
package.json
{ "dependencies": { "email-regex": "^5.0.0", "express": "^4.18.2", "mysql2": "^3.6.5", "supertest": "^6.3.3" }, "name": "projectvirtual", "version": "1.0.0", "main": "server.js", "scripts": { "startdev": "env-cmd -e dev nodemon server.js", "startprod": "env-cmd -e prod nodemon server.js", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "devDependencies": { "env-cmd": "^10.1.0", "nodemon": "^3.0.2" }, "description": "" }
问题分析与解决方案
1. 404错误原因及修复
浏览器访问localhost:3060时发送的是GET请求,但代码中仅定义了/register、/login、/logout三个POST路由,未配置根路径/的GET路由,因此返回404。
两种修复方式:
- 新增根路径GET路由,提示接口使用方式:
app.get('/', (req, res) => { res.send('服务器运行正常,请使用POST请求访问 /register、/login、/logout 接口'); });
- 使用Postman、curl等API测试工具,直接发送POST请求到对应接口,不要用浏览器直接访问根路径。
2. 注册路由状态码处理逻辑
注册场景需覆盖以下常见状态码,结合业务逻辑实现:
- 201 Created:账号创建成功(比200更符合语义)
- 400 Bad Request:请求参数缺失、格式错误(如邮箱格式不合法)
- 409 Conflict:邮箱已被注册
- 500 Internal Server Error:数据库操作失败等服务器内部错误
示例实现:
// 先添加JSON请求体解析中间件,否则无法获取req.body参数 app.use(express.json()); app.post('/register', (req, res) => { const { email, password } = req.body; // 校验必填参数 if (!email || !password) { return res.status(400).send('邮箱和密码不能为空'); } // 邮箱格式校验(可使用email-regex包或自定义正则) const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { return res.status(400).send('邮箱格式不正确'); } // 检查邮箱是否已注册 sqlconn.query('SELECT * FROM users WHERE email = ?', [email], (err, results) => { if (err) { return res.status(500).send('服务器内部错误'); } if (results.length > 0) { return res.status(409).send('该邮箱已被注册'); } // 密码哈希(后续用bcrypt包实现,示例先占位) // const hashedPassword = bcrypt.hashSync(password, 10); // 插入新用户到数据库 sqlconn.query('INSERT INTO users (email, password) VALUES (?, ?)', [email, password], (err) => { if (err) { return res.status(500).send('注册失败'); } res.status(201).send('账号创建成功'); }); }); });
3. 待实现功能提示
- 密码哈希:安装
bcrypt包,注册时对密码哈希后存入数据库,登录时用bcrypt.compareSync验证密码 - 邮箱正则校验:直接调用
email-regex包的校验逻辑,替代示例中的自定义正则 - Logout路由:若使用session认证,销毁用户session;若使用JWT,告知客户端删除本地存储的token,完善登出逻辑
内容的提问来源于stack exchange,提问作者Cordev87
相关产品推荐
相关产品推荐

