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

AngularJS遗留系统问题:存储过程未触发,数据无法拉取到表格

排查存储过程未触发问题 + ng-repeat疑问解答

一、存储过程未触发的排查步骤

咱们从最基础的环节一步步排查,缩小问题范围:

  • 第一步:验证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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:33:11