Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度';值未定义';订阅映射的http响应(未发出请求?)_Javascript_Angular_Typescript_Rxjs - Fatal编程技术网

Javascript 角度';值未定义';订阅映射的http响应(未发出请求?)

Javascript 角度';值未定义';订阅映射的http响应(未发出请求?),javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,我有一个简单的登录表单组件(LoginComponent),它调用submitLogin方法 从'@angular/core'导入{Component,OnInit}; 从'@angular/forms'导入{FormControl}; 从'@angular/Router'导入{Router,ActivatedRoute}; 从“rxjs/operators”导入{first}; 从“../../services”导入{AuthenticationService}; @组成部分({ 选择器:“登

我有一个简单的登录表单组件(
LoginComponent
),它调用
submitLogin
方法

从'@angular/core'导入{Component,OnInit};
从'@angular/forms'导入{FormControl};
从'@angular/Router'导入{Router,ActivatedRoute};
从“rxjs/operators”导入{first};
从“../../services”导入{AuthenticationService};
@组成部分({
选择器:“登录”,
templateUrl:'./login.component.html',
样式URL:['./login.component.scss']
})
导出类LoginComponent实现OnInit{
returnURL:string;
u=新表单控件(“”);
p=新表单控件(“”);
构造函数(私有路由:ActivatedRoute,私有路由器:router,私有身份验证:AuthenticationService){}
恩戈尼尼特(){
this.returnURL=this.route.snapshot.queryParams['returnURL']| |'/';
}
submitLogin():void{
this.auth.login(this.u.value,this.p.value).pipe(first()).subscribe(
r=>{
if(r){
log(“LoginComponent:r:,r”);
this.router.navigate([this.returnURL]);
}
},
错误=>{
console.error(“LoginComponent:error:”,error);
}
);
}
}
我收到的错误被打印为
LoginComponent:error:TypeError:“values”未定义
,并在该错误lambda中打印

AuthenticationService
大致如下:

从'@angular/core'导入{Injectable};
从'@angular/common/http'导入{HttpClient,HttpResponse};
从“rxjs”导入{BehaviorSubject,Observable};
从“rxjs/operators”导入{map};
从“../models/User”导入{User};
从“/api.service”导入{APIService};
@可注射({providedIn:'root'})
导出类身份验证服务{
private currentUserSubject:行为主体;
公共用户:可观察;
构造函数(私有http:HttpClient,私有api:APIService){
this.currentUserSubject=新行为主体(null);
this.currentUser=this.currentUserSubject.asObservable();
}
登录(u:string,p:string):可观察{
返回这个.api.login(u,p).pipe(map(
r=>{
如果(r&r.status==200){
this.updateCurrentUser();
console.log(“返回true”);
返回true;
}
console.log(“返回false”);
返回false;
}
));
}
}
请注意,映射lambda中的所有代码路径都返回布尔值。因此,此映射永远不应该吐出
未定义的值。顺便说一下,这些控制台日志永远不会发生

我的API服务负责调用我运行的版本化API。里面有很多不相关的东西,但相关的部分是:

从'@angular/core'导入{Injectable};
从'@angular/common/http'导入{HttpClient,HttpHeaders,HttpResponse};
从“rxjs”导入{BehaviorSubject,Observable};
从“rxjs/operators”导入{map,first};
@可注射({providedIn:'root'})
出口级服务{
公共API_版本='1.5';
私人饼干:字符串;
构造函数(私有http:HttpClient){}
私有do(方法:字符串,路径:字符串,数据?:对象):可观察{
const options={headers:newhttpheaders({'Content-Type':'application/json',
“Cookie”:this.cookies}),
将“响应”视为“响应”,
正文:数据};
返回此.http.request(方法、路径、选项).pipe(映射(r=>{
//TODO将警报传递给警报服务
设resp=r作为HttpResponse;
if(响应头中的“Cookie”){
this.cookies=resp.headers['Cookie']
}
控制台日志(“返回响应”);
返回响应;
}));
}
公共登录(u,p):可观察{
const path='/api/'+this.api_VERSION+'/user/login';
返回这个.do('post',path,{u,p});
}
}

请再次注意,映射lambda中的每个代码路径都返回一个值。还请注意,
“returning resp”
从未出现在控制台中。我也从未在网络面板中看到HTTP请求。有什么好处?为什么它不执行请求,和/或可能导致此错误的原因是什么?

复制代码后,我在控制台中得到的堆栈跟踪将我引导到Angular的httpClient模块的头代码中的“lazyInit”函数(
node\u modules\@Angular\common\esm5\http\src\headers.js

在函数的第二行中,它迭代您提交的标题的值,您可以在第三行看到
values
变量。在那里,它获取一个头并访问它的值。接下来,如果它是一个字符串,它会将其转换为一个数组,然后检查它的长度——此时您会得到异常

如果查看API服务,您将提交两个标题:

'Content-Type': 'application/json',
'Cookie': this.cookies
在前面,您定义了
cookies
变量,如下所示:

私有cookies:string

由于没有赋值,它默认为
undefined
,这是“Cookie”头的值,它不是字符串,也没有
length
属性,因此它会引发异常

解决方案:

cookies
的初始定义更改为

private cookies=''


修复此问题。

如果将任何未定义的
传递到
HTTP
调用的头,则可能会发生这种情况,如果
很常见,则可能会导致其他调用中断。使用默认的空值初始化值。Th