使用WHERE条件查询MSSQL无结果,求排查Angular+Node.js代码问题
问题排查:Angular+Node.js+MSSQL查询无返回结果
以下是代码中的关键错误及修正方案:
1. 前端GET请求参数传递错误
Angular的HttpClient.get()第二个参数是请求配置对象,直接传手机号会被当成配置项,导致后端无法接收参数。
错误代码(Service.ts):
getCustomerData(Phone_Number: any) { return this.http.get(`${this.url}/orders/getcustomer`,Phone_Number); }
修正方案(二选一):
- 方案一:使用路由参数
getCustomerData(Phone_Number: any) { return this.http.get(`${this.url}/orders/getcustomer/${Phone_Number}`); }
- 方案二:使用查询参数
import { HttpParams } from '@angular/common/http'; getCustomerData(Phone_Number: any) { const params = new HttpParams().set('phone', Phone_Number); return this.http.get(`${this.url}/orders/getcustomer`, { params }); }
2. 后端路由与参数接收不匹配
当前后端路由/getcustomer未定义参数占位符,req.params.phone无法获取到值,导致查询条件无效。
对应前端方案一的后端修正:
修改路由定义:
router.get("/getcustomer/:phone", custData); // 新增:phone路由参数
修正custData参数逻辑:
custData: (req, res) => { const phone = req.params.phone; // 原代码中let phone = req.phone无意义,req.phone不存在 checkCustPhone(phone,(error, result) => { if (error) { return res.status(500).send({ status: 0, message: error.message }); // 错误时不要访问result.recordset,此时result为undefined } return res.send({ status: 1, data: result.recordset }); }); }
对应前端方案二的后端修正:
从查询参数中获取手机号:
custData: (req, res) => { const phone = req.query.phone; checkCustPhone(phone,(error, result) => { if (error) { return res.status(500).send({ status: 0, message: error.message }); } return res.send({ status: 1, data: result.recordset }); }); }
3. SQL查询存在注入风险+类型不匹配问题
直接字符串拼接SQL语句,不仅有SQL注入风险,还可能因手机号类型不匹配(如数据库中Phone_Number为数字类型,加单引号后变成字符串查询)导致无结果。
错误代码:
checkCustPhone: (phone, callback) => { connection.query( `select * from tbl_customers where Phone_Number='${phone}'`, (error, result) => { if (error) { return callback(error); } return callback(null, result); } ); }
修正为参数化查询:
checkCustPhone: (phone, callback) => { // 使用?作为占位符,自动匹配类型并避免注入 connection.query( 'select * from tbl_customers where Phone_Number = ?', [phone], // 参数数组 (error, result) => { if (error) { return callback(error); } return callback(null, result); } ); }
4. 后端错误处理逻辑错误
当查询出现错误时,result为undefined,此时访问result.recordset会抛出异常,导致接口崩溃。
错误代码:
if (error) { return res.send({ status: 0, data: result.recordset }); }
修正:
if (error) { return res.status(500).send({ status: 0, message: error.message }); }
内容的提问来源于stack exchange,提问作者Enrique Ferolino
相关产品推荐
相关产品推荐

