Express登录路由异常:PromisePending与async/await无输出问题排查
Express登录路由异常排查与修复
问题根源
- 端口冲突:你的MySQL连接池配置中
port:3000,但Express服务也在监听3000端口,导致数据库连接无法正常建立,await db.getUserByEmail(email)会一直处于等待状态,因此没有任何控制台输出。 - 语法错误:登录路由的
try代码块存在多余的闭合括号,导致代码逻辑异常。 - 未返回响应:路由处理函数中没有向客户端返回任何响应,会导致请求一直挂起。
修正步骤
1. 修正MySQL连接池端口
MySQL默认端口为3306,将连接池配置中的port改为3306(如果自定义了MySQL端口,请填写实际端口):
const pool = mysql.createPool({ socketPath:'', host: 'localhost', user: 'fatima', password: 'acess', database: 'acess', multipleStatements: true, canRetry: true, connectionLimit : 1000, connectTimeout : 60 * 60 * 1000, acquireTimeout : 60 * 60 * 1000, timeout : 60 * 60 * 1000, port: 3306 // 修正为MySQL实际端口 });
2. 修复路由语法错误
移除try块中多余的闭合括号,并添加响应返回:
router.post('/login', async (req, res) => { try { const email = "sami@mail.com"; // const password = req.body.Pass; const user = await db.getUserByEmail(email); console.log("hi", user); // 向客户端返回响应 res.status(200).json({ user }); } catch(e) { console.log(e); // 返回错误响应 res.status(500).json({ error: e.message }); } });
现象解释
- 未使用
async/await时:直接调用db.getUserByEmail返回未决状态的Promise,控制台输出Promise { <pending> }是正常的,因为没有等待Promise完成。 - 添加
async/await后:由于数据库连接因端口冲突无法建立,Promise始终无法resolve或reject(你的超时设置为1小时),导致await一直阻塞,程序没有后续输出。
内容的提问来源于stack exchange,提问作者Fatima sami
相关产品推荐
相关产品推荐

