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

MySQL无匹配用户但Node.js登录代码仍输出Logged问题求助

问题分析与修复

核心错误:未校验查询结果是否存在

你的代码只判断了数据库查询是否出错,但没判断查询是否返回了有效用户数据。当数据库中没有对应nickname时,pool.query不会触发err,而是返回一个空数组[],此时代码依然会执行console.log('logged'+ resoult[0]),导致误输出"Logged"。

其他关键问题

  • SQL注入风险:直接用模板字符串拼接用户输入req.body.nickname,恶意用户可以构造特殊输入篡改SQL语句(比如输入" OR 1=1 --会查询所有用户)。
  • 变量名拼写错误:resoult应为result,属于代码规范问题。
  • 连接池误用:变量名是pool,但你用了createConnection创建单个连接,应该用createPool来创建连接池,适配多请求场景。

修正后的代码

const express = require('express')
const path = require('path')
const mysql = require('mysql2')

const app = express()

// 改用连接池创建方式
const pool = mysql.createPool({
  host: "localhost",
  port:'3306',
  user: 'root',
  password:'1234567890',
  database:'mydb'
}).promise(); // 可选:使用Promise API,避免回调嵌套

app.use(express.json())
app.use(express.static('client'))

app.post('/', async (req,res) => {
  try {
    // 使用参数化查询,避免SQL注入
    const [rows] = await pool.query('select * from users where nickname = ?', [req.body.nickname])
    
    if (rows.length > 0) {
      console.log('Logged')
      res.status(200).send('登录成功') // 记得给前端返回响应
    } else {
      console.log('NotLogged')
      res.status(401).send('用户不存在')
    }
  } catch (err) {
    console.log('查询出错:', err)
    res.status(500).send('服务器错误')
  }
})

app.listen(3000, ()=>{
  console.log('server is running at port 3000')
})

修正说明

  1. 校验查询结果:通过rows.length > 0判断是否存在用户,只有存在时才输出"Logged"。
  2. 参数化查询:用?作为占位符,将用户输入作为参数传入,彻底避免SQL注入。
  3. 改用Promise/async-await:替代回调函数,代码更易读,错误处理更清晰。
  4. 添加前端响应:原代码没有给前端返回任何响应,修正后根据结果返回对应状态码和信息。
  5. 修正连接池创建:使用createPool创建连接池,适合多请求场景。

内容的提问来源于stack exchange,提问作者Hehe Aco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 15:47:35