Node.js OracleDB登录POST请求:凭证匹配却提示认证失败
问题:OracleDB认证时凭证匹配但仍返回“Authentication failed”
问题原因分析
async/await与回调函数混用
你在connection.execute中同时使用了await和回调函数,这会导致代码执行逻辑混乱:await会等待Promise完成并返回结果,但回调函数里的逻辑会额外执行,且外层的result变量实际为undefined,同时可能出现重复响应的问题。userCount取值错误
OracleDB的查询结果里,result.rows[0]是一个包含计数的数组(比如[1]),而非直接的数值1。因此userCount === 1的判断永远不成立,即使数据库返回的计数确实是1。
修复步骤
- 移除
connection.execute的回调函数,纯用async/await处理异步逻辑 - 正确提取计数数值:从
result.rows[0][0]获取COUNT(*)的结果 - 增加try/catch/finally块,统一处理错误并确保数据库连接关闭
修正后的完整代码
app.post("/", async function(req, res) { let connection; try { const { username, password } = req.body; const sqlquery = 'SELECT COUNT(*) AS userCount FROM USERS WHERE EMAIL = :username AND PASSWORD = :password'; connection = await oracledb.getConnection(dbConfig); const result = await connection.execute(sqlquery, { username, password }); const userCount = result.rows[0][0]; // 正确提取数值类型的计数结果 console.log(userCount); if (userCount === 1) { return res.render("playercentre"); } else { return res.status(401).send('Authentication failed'); } } catch (err) { console.error('Error during authentication:', err); return res.status(500).send('Internal server error'); } finally { // 确保数据库连接被关闭,避免连接泄漏 if (connection) { try { await connection.close(); } catch (err) { console.error('Error closing connection:', err); } } } });
修复说明
- 用try/catch包裹所有异步操作,统一捕获并处理连接、查询过程中的错误
- 移除回调函数,通过await直接获取
connection.execute的返回结果 - 从
result.rows[0][0]提取计数值,因为OracleDB返回的每一行数据都是数组格式 - finally块保证无论认证成功或失败,数据库连接都会被关闭
内容的提问来源于stack exchange,提问作者Kostas Drosatos
相关产品推荐
相关产品推荐

