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') })
修正说明
- 校验查询结果:通过
rows.length > 0判断是否存在用户,只有存在时才输出"Logged"。 - 参数化查询:用
?作为占位符,将用户输入作为参数传入,彻底避免SQL注入。 - 改用Promise/async-await:替代回调函数,代码更易读,错误处理更清晰。
- 添加前端响应:原代码没有给前端返回任何响应,修正后根据结果返回对应状态码和信息。
- 修正连接池创建:使用
createPool创建连接池,适合多请求场景。
内容的提问来源于stack exchange,提问作者Hehe Aco
相关产品推荐
相关产品推荐

