为何数据库query无返回值?Node.js登录接口排查求助
问题排查与修复方案
核心问题分析
你的代码存在多个关键问题,导致接口无返回、逻辑无法正常执行:
- 混用Promise与回调API:使用了
mysql2/promise的Promise式连接池,却用回调写法调用getConnection和query,导致逻辑流程断裂。 - 未向前端返回响应:接口函数全程没有调用
res.json()/res.send()等响应方法,前端自然收不到任何数据。 - 连接释放错误:错误调用
db.release(),正确的释放逻辑应该是针对getConnection拿到的connection对象,且mysql2/promise的连接池可自动管理连接,无需手动操作。 - 请求体解构错误:若前端传递标准JSON格式(如
{"email":"xxx","password":"xxx"}),req.body[0]/req.body[1]无法获取对应值。 - 错误处理不规范:回调中
throw err会引发未捕获异步异常,可能导致服务器崩溃。
修复后的代码
1. 接口文件 api/login/index.js
// api/login/index.js import { db } from '../server/db.js'; export default async function(req, res) { try { // 正确解构请求体的email和password(适配前端JSON格式) const { email, password } = req.body; // 使用mysql2/promise的async/await语法执行查询 const [result] = await db.query( 'SELECT email FROM users WHERE email = ? AND password = ?', [email, password] ); // 根据查询结果返回对应响应 if (result.length > 0) { res.status(200).json({ success: true, message: '验证通过', user: { email: result[0].email } // 避免返回敏感字段password }); } else { res.status(401).json({ success: false, message: '邮箱或密码错误' }); } } catch (error) { // 捕获异常并返回错误响应,同时记录日志 console.error('查询错误:', error); res.status(500).json({ success: false, message: '服务器内部错误' }); } }
2. 数据库配置文件 db.js
// db.js import dotenv from 'dotenv'; import sql from 'mysql2/promise'; // 修正.env路径,根目录下应为./.env而非/.env dotenv.config({ path: './.env' }); export const db = sql.createPool({ host: process.env.NEXT_PUBLIC_DB_HOST, user: process.env.NEXT_PUBLIC_DB_USERNAME, database: process.env.NEXT_PUBLIC_DB_NAME, password: process.env.NEXT_PUBLIC_DB_PASSWORD, waitForConnections: true, queueLimit: 0 });
额外注意事项
- 避免向前端返回用户密码等敏感字段,即使测试环境也需遵循安全规范。
- 确认
.env文件路径正确,否则会导致数据库连接失败。 - 生产环境中建议对密码进行哈希存储(如使用bcrypt),不要明文存储用户密码。
内容的提问来源于stack exchange,提问作者Pierre Loti
相关产品推荐
相关产品推荐

