You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:56:04