Я довольно новичок в 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 или каких-либо упоминаниях может быть какая-либо разница. иначе они сталкиваются с той же проблемой.
ТАК, есть что-то очевидное или не очень очевидное, что я пропускаю? Любая помощь будет оценена.