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

Node.js OracleDB登录POST请求:凭证匹配却提示认证失败

问题:OracleDB认证时凭证匹配但仍返回“Authentication failed”

问题原因分析

  1. async/await与回调函数混用
    你在connection.execute中同时使用了await和回调函数,这会导致代码执行逻辑混乱:await会等待Promise完成并返回结果,但回调函数里的逻辑会额外执行,且外层的result变量实际为undefined,同时可能出现重复响应的问题。

  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 22:05:17