Angular переопределить свойства объекта HttpErrorReponse - PullRequest
0 голосов
/ 11 марта 2020

Я довольно новичок в Angular (8), но я создаю внешний SPA, который выполняет http-вызовы с использованием модуля HttpClient для внутреннего интерфейса Node Express. В ответе API я могу установить статус ответа Http вместе с дополнительным JSON объектом, используя приведенный ниже в качестве базового c пример:

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 и получить доступ к объекту 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) и создаю те же условия для получения HttpError от API, мое свойство error error больше не содержит мой пользовательский объект, а вместо этого возвращается к " Страница не отображалась, потому что произошел конфликт. "Я предполагаю, что это стандартная строка с учетом ответа 409?

Я не могу понять, почему в моем коде Angular или узле это должно быть ведут себя по-разному в зависимости от среды, поэтому я предполагаю, что это как-то связано с командой ng build --prod или, наоборот, с развертыванием iisnode. Google не был полезен, и фактически на каждой доске объявлений или уроке, с которыми я сталкивался, предлагаемое решение в целом совпадает с тем, что я делаю, без каких-либо указаний на то, что при развертывании в Production или каких-либо упоминаниях может быть какая-либо разница. иначе они сталкиваются с той же проблемой.

ТАК, есть что-то очевидное или не очень очевидное, что я пропускаю? Любая помощь будет оценена.

1 Ответ

0 голосов
/ 12 марта 2020

Хорошо, так что я понял это, и быстрый Google, включающий термин «iisnode», сразу же нашел решение. Как я не думал об этом раньше, я не уверен.

Во всяком случае, для всех, кто борется с этим, это ссылка, по которой я следовал для разрешения: https://github.com/tjanczuk/iisnode/issues/295

В основном вам нужно добавить две вещи в файл web.config на iisnode:

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

Поток фактически говорит об использовании <httpErrors existingResponse="passthrough" />, но я обнаружил, что с помощью "PassThrough" (с с заглавными буквами) работал там, где исходное строчное значение не было.

...