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
相关产品推荐
相关产品推荐

