HTTP 拦截器:您在需要流的位置提供了 'undefined'
HTTP interceptor: you provided 'undefined' where a stream was expected
我正在使用 angular 6,试图实现 http 拦截器,它在尝试登录时给了我 ou provided 'undefined' where a stream was expected
。我没有 jwt 令牌,我有一个 x-session
interceptor.ts
constructor(private injector: Injector) { }
intercept(req, next) {
const auth = this.injector.get(AuthService);
const token = auth.getToken();
if (token) {
const tokenizedReq = req.clone({
setHeaders: ({
'Content-Type': 'application/json',
'x-session': token
})
});
return next.handle(tokenizedReq);
}
login service
login(username, password) {
const data = {
username: username,
password: password
};
const headers = new HttpHeaders({ 'Content-Type': 'application/json' });
return this.http.post(this.login_url, data, { headers: headers, observe: 'response' });
}
getToken() {
return JSON.parse(localStorage.getItem('token'));
}
login component
onLogin() {
this.auth.login(this.username, this.password).subscribe(data => {
if (localStorage.getItem('data') === null) {
localStorage.setItem('data', JSON.stringify(data));
}
const token = data.headers.get('x-session');
const expiry = data.headers.get('x-session-expiry');
localStorage.setItem('token', JSON.stringify(token));
localStorage.setItem('token-expiry', JSON.stringify(expiry));
this.router.navigate(['']);
}, err => {
console.log(err);
});
}
如何修复错误?我猜如果我用的是jwt,应该不会报错,因为大多数文章都推荐上面的方式或者类似的方式。
我不知道我的解决方案是否是最好的,但它似乎有效,如果有人有更好的解决方案,我会接受他的。
interceptor
constructor(private injector: Injector) { }
intercept(req, next) {
const auth = this.injector.get(AuthService);
const token = auth.getToken();
if (token) {
const tokenizedReq = req.clone({
setHeaders: ({
'Content-Type': 'application/json',
'x-session': token
})
});
return next.handle(tokenizedReq);
} else {
const tokenizedReq = req.clone({
setHeaders: {
'Content-Type': 'application/json'
}
});
return next.handle(tokenizedReq);
}
}
login service
login(username, password) {
const data = {
username: username,
password: password
};
return this.http.post(this.login_url, data, { observe: 'response' });
}
所以请注意,我添加了一个 else 语句,如果用户已登录,则添加令牌,否则,不要添加。
我正在使用 angular 6,试图实现 http 拦截器,它在尝试登录时给了我 ou provided 'undefined' where a stream was expected
。我没有 jwt 令牌,我有一个 x-session
interceptor.ts
constructor(private injector: Injector) { }
intercept(req, next) {
const auth = this.injector.get(AuthService);
const token = auth.getToken();
if (token) {
const tokenizedReq = req.clone({
setHeaders: ({
'Content-Type': 'application/json',
'x-session': token
})
});
return next.handle(tokenizedReq);
}
login service
login(username, password) {
const data = {
username: username,
password: password
};
const headers = new HttpHeaders({ 'Content-Type': 'application/json' });
return this.http.post(this.login_url, data, { headers: headers, observe: 'response' });
}
getToken() {
return JSON.parse(localStorage.getItem('token'));
}
login component
onLogin() {
this.auth.login(this.username, this.password).subscribe(data => {
if (localStorage.getItem('data') === null) {
localStorage.setItem('data', JSON.stringify(data));
}
const token = data.headers.get('x-session');
const expiry = data.headers.get('x-session-expiry');
localStorage.setItem('token', JSON.stringify(token));
localStorage.setItem('token-expiry', JSON.stringify(expiry));
this.router.navigate(['']);
}, err => {
console.log(err);
});
}
如何修复错误?我猜如果我用的是jwt,应该不会报错,因为大多数文章都推荐上面的方式或者类似的方式。
我不知道我的解决方案是否是最好的,但它似乎有效,如果有人有更好的解决方案,我会接受他的。
interceptor
constructor(private injector: Injector) { }
intercept(req, next) {
const auth = this.injector.get(AuthService);
const token = auth.getToken();
if (token) {
const tokenizedReq = req.clone({
setHeaders: ({
'Content-Type': 'application/json',
'x-session': token
})
});
return next.handle(tokenizedReq);
} else {
const tokenizedReq = req.clone({
setHeaders: {
'Content-Type': 'application/json'
}
});
return next.handle(tokenizedReq);
}
}
login service
login(username, password) {
const data = {
username: username,
password: password
};
return this.http.post(this.login_url, data, { observe: 'response' });
}
所以请注意,我添加了一个 else 语句,如果用户已登录,则添加令牌,否则,不要添加。