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

Oracle SQL记录校验异常:NodeJS接口与Angular前端无响应排查

问题分析与解决方案

咱们先来拆解你遇到的核心问题:当查询不到目标记录时前端无任何响应,本质是后端接口在无匹配结果时会抛出未捕获的错误,导致无法返回预期的404响应,前端自然收不到反馈。另外你的代码还存在SQL注入风险、前端校验逻辑合理性的小问题,我一步步帮你修复。

1. 后端NodeJS接口的核心问题与修复

先看你的后端代码:当数据库没有匹配idecod='${document}'的记录时,result.rows会是空数组,这时候你尝试访问result.rows[0][0]会直接触发Cannot read properties of undefined (reading '0')的错误——因为result.rows[0]是undefined,根本没有[0]这个属性。这个未捕获的错误会导致接口崩溃,无法返回你写的404响应,前端也就收不到任何反馈。

另外,直接用字符串拼接SQL语句idecod='${document}'存在严重的SQL注入风险,绝对不能在生产环境这么用!

修复后的后端代码:

export async function getGuard(req: Request, res: Response): Promise<any> { 
  let conn;
  try {
    conn = await connect(); 
    const { document} = req.params; 
    // 使用参数化查询避免SQL注入
    const result = await conn.execute( 
      `SELECT ideide FROM basdat.siide 
       JOIN basdat.siideead ON idecod = ideeadcod 
       WHERE idecod = :document AND ideeadact = 'S'`,
      [document] // 传入参数,驱动会自动处理转义
    ); 

    // 先判断是否有返回结果,避免访问undefined的属性
    if (result.rows.length > 0) {
      return res.json(result.rows[0][0]); 
    } else { 
      res.status(404).json({ text: "Registro no existe" }); 
    }
  } catch (err) {
    // 捕获所有异常,确保接口能返回错误响应
    console.error('查询出错:', err);
    res.status(500).json({ text: "Error en la consulta" });
  } finally {
    // 确保数据库连接无论成功失败都会关闭,避免连接泄漏
    if (conn) {
      await conn.close();
    }
  }
}

这里做了三个关键优化:

  • 用参数化查询替代字符串拼接,彻底杜绝SQL注入风险。
  • 增加try/catch/finally块:捕获所有异常,保证接口能返回错误响应;同时确保数据库连接一定会关闭,避免连接泄漏。
  • 先判断result.rows.length,只有当有记录时才访问rows[0][0],彻底避免undefined错误。

2. 前端Angular代码的逻辑优化

你的前端校验逻辑有点绕:当后端返回记录时,你判断documentreg == documentser,但其实后端返回的是存在的ideide值,逻辑应该是只要后端成功返回数据,就说明记录存在;如果返回404,说明记录不存在。

优化后的前端代码:

const documentreg = this.forma.value.document;
console.log('待校验的文档号:', documentreg);

this._usuarioService.getdocument(documentreg)
.subscribe( 
  resp => {
    // 进入这里说明记录存在
    console.log('记录存在,返回的IDEIDE:', resp);
    // 这里可以添加记录存在时的处理逻辑,比如提示用户该文档已注册
  }, 
  err => {
    // 捕获错误,区分不同状态码
    if (err.status === 404) {
      // 404对应记录不存在
      console.log('记录不存在,可以继续注册');
      // 添加记录不存在时的处理逻辑
    } else {
      // 其他错误,比如服务器内部异常
      console.error('校验出错:', err);
    }
  } 
);

这样逻辑更清晰:成功回调对应记录存在,404错误对应记录不存在,其他错误则是服务器端的问题。

3. 额外注意事项

  • 确保你的Angular服务_usuarioService.getdocument在调用后端接口时,正确处理了HTTP错误状态码(Angular的HttpClient默认会把非2xx的状态码当作错误抛出,这部分一般没问题,但如果有自定义拦截器,需要检查是否修改了这个行为)。
  • 数据库连接的connect()方法如果有异常,上面的try/catch已经覆盖了这一点,不用担心遗漏。

内容的提问来源于stack exchange,提问作者Rafael Pereira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:58:04