我正在开发一个Angular 2应用程序,需要一些关于如何干净地处理身份验证错误的指导.
我的最终目标是能够集中处理每个Http
请求的身份验证错误(特别是401和403).
我发现这个问题对于让我开始非常有帮助,但是我仍然坚持为我的自定义Http
实现返回的每个observable注册我的错误处理程序的正确方法.
以下是我目前正在使用的示例:
import { Injectable } from 'angular2/core';
import { Http, ConnectionBackend, Request, RequestOptions, RequestOptionsArgs, Response } from 'angular2/http';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class ClauthHttp extends Http {
constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) {
super(backend, defaultOptions);
}
get(url: string, options ? : RequestOptionsArgs): Observable < Response > {
var response = super.get(url, options);
return this._handleSecurityResponse(response);
}
/*
Other overrides omitted for brevity...
*/
private _handleSecurityResponse(response: Observable < Response …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个前端,它使用服务器提供的JSON服务.
我很高兴使用Angular2的HTTP,我可以通过.catch()
运算符捕获错误.
如果我发现与特定服务相关的问题(例如,服务未由服务器定义),则catch()
运营商会收到Response
状态404
,我可以轻松管理该情况.
另一方面,如果服务器完全关闭,则catch()
操作员会收到带有状态代码的响应,200
并且没有与问题原因相关的特定标志或文本(即整个服务器已关闭).在控制台上,我看到angular(http.dev.js)写了一条消息,net::ERR_CONNECTION_REFUSED
但我不知道如何在我的代码中做一些类似的事情(即理解正在发生的事情并做出适当的反应).
任何帮助,将不胜感激.
我和Angular 1有类似的问题,所以我理解如何实现,只是我错过了最后一步.
就像上次一样,为我们的应用做后端的人接受类型的请求,application/x-www-form-urlencoded
就像Angular 1一样,Angular 2也会发送类型application/json
.
我用ng1做的是在配置中我修改了http提供程序以在每个请求的主体上运行urlencoded.
我在ng2中看到有一个https://angular.io/docs/ts/latest/api/http/BaseRequestOptions-class.html
这个BaseRequestOptions
类,我认为这个类只是为了这个唯一的文档有点not there
所以我不是确定如何正确实现这一点(我也是TypeScript的新手).
我如何提供这个,以便我的每个post
请求都urlencoded
在最后发送(我也希望函数在主体上运行,以便它实际上变为urlencoded).
另外:为什么没有一个更简单的选项,因为到现在我可以看到ASP.Net和Flask(所以我想其他许多人)application\json
默认不支持?
编辑:我已经创建了一个自定义函数,我在POST体中发送的每个对象上使用,但我希望有一个更简单,更通用的解决方案.
import { URLSearchParams } from 'angular2/http';
export function urlEncode(obj: Object): string {
let urlSearchParams = new URLSearchParams();
for (let key in obj) {
urlSearchParams.append(key, obj[key]);
}
return urlSearchParams.toString();
}
Run Code Online (Sandbox Code Playgroud)
然后我就像使用它一样
this.http.post('http://localhost:5000/user/auth/login', urlEncode(data))
Run Code Online (Sandbox Code Playgroud) 我在解决DI问题方面取得了成功.我已经阅读了一些教程并获得了jist但是在使用我的自定义服务制作了一些嵌套的DI后,事情开始崩溃了.
有人可以解释何时使用useFactory而不是useClass?我已经看过ng2文档,我已经看过这些例子,但是我无法将它们映射到我的问题中.目前我的引导程序看起来像这样:
bootstrap(
App,
[
FORM_PROVIDERS,
ROUTER_PROVIDERS,
HTTP_PROVIDERS,
provide(LocationStrategy, { useClass: PathLocationStrategy }),
provide(RequestOptions, { useClass: DefaultRequestOptions }),
provide(MsgService, { useClass: MsgService }),
provide(HttpAdvanced, { useFactory: (MsgService, HTTP_PROVIDERS) => new HttpAdvanced(MsgService, HTTP_PROVIDERS), deps: [MsgService, HTTP_PROVIDERS] }),
provide(AuthService, { useFactory: (HttpAdvanced) => new AuthService(HttpAdvanced), deps: [HttpAdvanced, HTTP_PROVIDERS, MsgService] }),
provide(FormBuilderAdvanced, { useFactory: (FormBuilder, HttpAdvanced) => new FormBuilderAdvanced(FormBuilder, HttpAdvanced), deps: [FormBuilder, HttpAdvanced] }),
provide(MsgServiceInternal, { useClass: MsgServiceInternal })
]
);
Run Code Online (Sandbox Code Playgroud)
我的最新一期是:
EXCEPTION: Error during instantiation of AuthService! (HeaderBar -> AuthService).
ORIGINAL EXCEPTION: …
Run Code Online (Sandbox Code Playgroud) 如果Angular2遇到内部异常,它将不会记录到控制台.如何检测以下异常?
EXCEPTION: Error during instantiation of MainFormComponent!.
ORIGINAL EXCEPTION: TypeError: Cannot set property 'crashMeMaybe' of undefined
ORIGINAL STACKTRACE:
... stacktrace ...
ERROR CONTEXT:
... context object ...
Run Code Online (Sandbox Code Playgroud)
有没有可用的订阅?这样的文件在哪里?
我将许多HTTP请求发送到服务器,并且服务器返回每个请求带有新访问令牌的响应(可能在标题或正文中).
有没有办法在它完成之前或之后处理所有响应,比如某些后端框架中的请求的中间件?