【问题标题】:Angular override HttpErrorReponse object propertiesAngular 覆盖 HttpErrorReponse 对象属性
【发布时间】:2020-06-23 13:51:24
【问题描述】:

我对 Angular (8) 还很陌生,但一直在构建一个前端 SPA,它使用 HttpClient 模块对 Node Express 后端 API 进行 http 调用。在 API 响应中,我可以使用以下作为基本示例来设置 Http 响应状态以及附加 JSON 对象:

router.delete('/api/admin/roles', auth, (req, res) => {
  queries.deleteRole(req.query.roleid, (err,result) => {
    if (err) {
      if (err.number == 547) {
        return res.status(409).json({
          message: 'Users exist with this role. Cannot cascade delete.'
        })
      }
      return res.status(500).send()
    }
    return res.send(result)
  })
})

当我在开发环境中运行上述代码时,我可以成功拦截 HttpErrorResponse 并使用 message 属性访问 err.error 对象。我的拦截器如下所示:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(req).pipe(
      catchError((err: any) => {
        if (err instanceof HttpErrorResponse) {
          if (err.status === 401) {
            this.toastService.show(new Toast('Your session has expired and you have been logged out. Please log back in.', 'Session expired', {'delay': 5000, 'classname': 'bg-info text-light'}))
            this.authService.logOut();
          } else if (err.status === 409) {
            console.log(err)
            let errText = err.error.message || 'Record has been updated by another user. Please refresh page and retry.'
            this.toastService.show(new Toast(errText
            , 'Update conflict', {'delay': 5000, 'classname': 'bg-danger text-light'}))
          } else if (err.status == 403) {
            this.toastService.show(new Toast('You do not have the appropriate permissions to perform this action. Please contact your line manager to request access.'
            , 'Not authorized', {'delay': 5000, 'classname': 'bg-danger text-light'}))
          }
        }

        return next.handle(req)
      })
    )
  }

这一切在开发中都可以正常工作。 但是,当我运行 ng build --prod 并将我的应用程序部署到 IIS 服务器(使用 iisnode)并创建相同的条件以从 API 接收 HttpError 时,我的响应错误属性不再包含我的自定义对象,而是恢复为“由于发生冲突,页面未显示。”,我猜这是给定 409 响应的一些标准字符串?

我看不出为什么在我的 Angular 代码或 Node 中它的行为会因环境而异,所以我假设这与 ng build --prod 命令或 iisnode 部署有关。谷歌并没有提供帮助,事实上,在我遇到的每个留言板或教程中,建议的解决方案似乎与我正在做的事情大致匹配,没有迹象表明在部署到生产或任何人提及时可能有任何不同否则他们会遇到同样的问题。

所以,我遗漏了什么明显或不那么明显的东西吗?任何帮助将不胜感激。

【问题讨论】:

    标签: node.js angular response http-error


    【解决方案1】:

    好的,所以我最终弄清楚了这一点,并且包含术语“iisnode”的快速谷歌立即提供了解决方案。我以前怎么没有想到这一点,我不确定。

    无论如何,对于其他为此苦苦挣扎的人,这是我为解决问题而遵循的链接: https://github.com/tjanczuk/iisnode/issues/295

    基本上你需要在 iisnode 上的 web.config 文件中添加两件事:

      <configuration>
        <system.web>
          <customErrors mode="off" />    <-- this one here
        </system.web>
        <system.webServer>
          <httpErrors existingResponse="PassThrough" />    <-- and this one too
    ...
    

    线程实际上说要使用&lt;httpErrors existingResponse="passthrough" /&gt;,但我发现使用“PassThrough”(大写)在原来的小写值没有的地方起作用。

    【讨论】: