我有一个login.component
login() {
this.accountService.login(this.model)
.subscribe(
response => {
//do stuff
},
(error: AppError) => {
// do stuff
},
);
登录服务
login(loginModel: LoginModel) {
return this.http.post('auth/login/', loginModel).pipe(
tap(response => {
if (response) {
//add jwt to local storage
}
}));
}
和一个httpinterceptor
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const headerSettings: { [ name: string ]: string | string[]; } = {};
return this.localStorage.getItem(AppStorageKeys.JWT).pipe(
mergeMap((token: any) => {
if (token)
//add to headers etc
const apiReq = req.clone({ url: `${environment.apiBase}/${req.url}`, headers: newHeader });
return next.handle(apiReq);
}));
}
登录失败时,login.component显示错误。登录成功后,便可以从api中成功检索到令牌,正如我在开发工具中的“网络”标签中所看到的那样,但是该值从未存储在login.service的map函数中,也没有调用response => {}函数在login.component.ts中-会出错吗?
我在做什么错了?
-----编辑:
我已经创建了一个stackblitz,但是它正在那里工作,这使我相信这可能是因为我的login.component和服务位于子模块中,并且与拦截器有关。
答案 0 :(得分:1)
如注释中所述,默认情况下,Angular 6 HttpClient
仅接受JSON作为响应。为了更改可接受的响应类型,请向post
函数调用中添加第三个参数,如下所示:
return this.http.post('auth/login/', loginModel, {responseType: 'text'})
有关更多信息,请参见:https://angular.io/guide/http#requesting-non-json-data