AngularJS遗留系统问题:存储过程未触发,数据无法拉取到表格
一、存储过程未触发的排查步骤
咱们从最基础的环节一步步排查,缩小问题范围:
第一步:验证API端点是否能正常访问
用Postman、curl或者浏览器直接请求/api/calls(记得带上认证凭证,因为路由里加了auth.isAuthenticated()拦截),重点看:- 请求有没有返回401(未授权)?如果是,说明用户没通过认证,请求被拦截了,前端可能没正确携带登录态。
- 如果返回500,仔细看返回的错误信息,有没有数据库连接失败、存储过程不存在这类明确提示。
第二步:核对存储过程名称的准确性
代码里的'storedprocedurename'必须和数据库里的存储过程名完全匹配,包括大小写(虽然MSSQL默认不区分,但部分严格配置的环境会区分),别出现拼写错误、漏写前缀/后缀的情况。第三步:确认数据库账号的执行权限
应用连接数据库的账号,有没有被授予执行这个新存储过程的权限?其他存储过程能正常运行不代表新的也有权限,你可以手动用这个账号在数据库里执行一遍存储过程,验证是否能成功。第四步:检查输入参数的合法性
在request.execute前加一行日志:console.log('当前用户ID:', req.user),看看req.user的值是不是符合mssql.BigInt(8)的类型要求。如果req.user是字符串、null或者超出BigInt范围的数值,都会导致参数传递失败,存储过程无法触发。第五步:调试前端请求状态
打开浏览器控制台的「Network」面板,刷新页面后观察/api/calls的请求:- 请求有没有发送?如果没发送,可能是路由配置有问题,或者
Call.load()没被正确调用(比如CallCtrl控制器没被触发)。 - 请求的响应内容是什么?如果返回空数组或者错误,对应排查后端逻辑。
- 请求有没有发送?如果没发送,可能是路由配置有问题,或者
第六步:优化数据库连接关闭逻辑(可选)
目前conn.close()写在request.execute的回调里,逻辑上没问题,但可以改成finally块确保连接一定会关闭,避免资源泄漏:request.execute('storedprocedurename', function (err, recordset) { try { if (err) { res.status(500).json(err); } else { res.status(200).json(recordset[0]); } } finally { conn.close(); } });
二、关于ng-repeat="call in calls"的疑问
你的理解完全正确!call就是calls数组中每一项的临时别名/标识符,相当于JavaScript里for...of循环的迭代变量:
for (const call of calls) { // 这里的call就是当前循环到的数组元素 }
在Angular的ng-repeat里,每次循环都会把calls数组里的一个元素赋值给call,然后你就可以在<tr>标签里用call.StartedDateTime来访问这个元素的属性,渲染到页面上。比如如果calls是:
[ { StartedDateTime: '2024-05-20 10:00:00' }, { StartedDateTime: '2024-05-20 11:00:00' } ]
ng-repeat会生成两行<tr>,第一行的call指向第一个对象,第二行指向第二个对象,对应的call.StartedDateTime就会显示对应的时间。
内容的提问来源于stack exchange,提问作者Alex

