Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.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 无法读取属性';请求';未定义的_Javascript_Angular_Typescript - Fatal编程技术网

Javascript 无法读取属性';请求';未定义的

Javascript 无法读取属性';请求';未定义的,javascript,angular,typescript,Javascript,Angular,Typescript,我目前正在为angular应用程序实现一个基本服务。这应该为其他服务提供方法,以便使用默认头和默认选项组合请求。当我尝试调用get或post方法时,就会出现问题。这些方法只是调用this.request,但我得到了一个带有此错误的ZoneAwarePromise ERROR Error: Uncaught (in promise): Cannot read property 'request' of undefined at resolvePromise (zone.js:831)

我目前正在为angular应用程序实现一个基本服务。这应该为其他服务提供方法,以便使用默认头和默认选项组合请求。当我尝试调用get或post方法时,就会出现问题。这些方法只是调用this.request,但我得到了一个带有此错误的ZoneAwarePromise

ERROR Error: Uncaught (in promise): Cannot read property 'request' of undefined
    at resolvePromise (zone.js:831)
    at zone.js:896
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
    at Object.onInvokeTask (core.js:17280)
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:422)
    at Zone.push../node_modules/zone.js/dist/zone.js.Zone.runTask (zone.js:195)
    at drainMicroTaskQueue (zone.js:601)
    at ZoneTask.push../node_modules/zone.js/dist/zone.js.ZoneTask.invokeTask [as invoke] (zone.js:502)
    at invokeTask (zone.js:1744)
    at HTMLButtonElement.globalZoneAwareCallback (zone.js:1770)
defaultErrorLogger  @   core.js:15714
push../node_modules/@angular/core/fesm5/core.js.ErrorHandler.handleError    @   core.js:15762
next    @   core.js:17761
schedulerFn @   core.js:13505
push../node_modules/rxjs/_esm5/internal/Subscriber.js.SafeSubscriber.__tryOrUnsub   @   Subscriber.js:192
push../node_modules/rxjs/_esm5/internal/Subscriber.js.SafeSubscriber.next   @   Subscriber.js:130
push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber._next  @   Subscriber.js:76
push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next   @   Subscriber.js:53
push../node_modules/rxjs/_esm5/internal/Subject.js.Subject.next @   Subject.js:47
push../node_modules/@angular/core/fesm5/core.js.EventEmitter.emit   @   core.js:13489
(anonymous) @   core.js:17311
push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke    @   zone.js:391
push../node_modules/zone.js/dist/zone.js.Zone.run   @   zone.js:150
push../node_modules/@angular/core/fesm5/core.js.NgZone.runOutsideAngular    @   core.js:17248
onHandleError   @   core.js:17311
push../node_modules/zone.js/dist/zone.js.ZoneDelegate.handleError   @   zone.js:395
push../node_modules/zone.js/dist/zone.js.Zone.runGuarded    @   zone.js:164
_loop_1 @   zone.js:694
api.microtaskDrainDone  @   zone.js:703
drainMicroTaskQueue @   zone.js:608
push../node_modules/zone.js/dist/zone.js.ZoneTask.invokeTask    @   zone.js:502
invokeTask  @   zone.js:1744
globalZoneAwareCallback
这显然没有什么意义,因为我试图在post方法中调用
this.request
之前记录
this.request的值,浏览器显示
this.request
存在

接口选项{
有效载荷?:任何,
标题?:任何,
选项?:有吗
}
@可注射()
出口级服务{
私有主机:字符串=`${environment.apiUrl}`;
构造函数(私有http:HttpClient){}
公共获取(路由:字符串,选项?:任意){
返回此.request(路由'GET',选项);
}
公共邮政(路线:字符串,选项?:任意){
返回此。请求(路由“POST”,选项);//{
constURL=新url(路由,this.host);
const fn=this.http[method.toLowerCase()];
const{payload,header,options}:options=requestOptions | |{};
const defaultHeaders={'Content-Type':'application/json'};
const token=localStorage.getItem('token');
如果(令牌)defaultHeaders['Authorization']=令牌;
常量选项定义={
…选项,
事实上,
标头:新的HttpHeaders({…defaultHeaders,…headers})
};
fn(url.toString(),有效负载,选项定义)
.subscribe(()=>{console.log('resolve');resolve()},
()=>{console.log('reject');reject()});
});
}
}
我希望调用request方法时不会出现此错误。有人能帮我吗

编辑

我在下面的
login
方法中调用post方法:

@Injectable()
导出类身份验证服务{
私有用户:any=null;
构造函数(专用服务:ApiService){
控制台日志(服务);
service.get('/api/users/current')
.然后(user=>this.user=user)
.catch(service.token);
}
登录(用户名:string,密码:string):承诺{
常量选项:任意={
选项:{responseType:'text'},
有效负载:{用户名,密码},
};
返回新承诺((解决、拒绝)=>{
const onSuccess=响应=>{
this.service.setToken(响应);
解决();
};
const onFailure=错误=>{
拒绝(错误消息);
};
this.service.post('/api/auth',options)
.然后(成功)
.捕获(失败时);
});
}
注销():承诺{
返回新承诺((解决、拒绝)=>{
this.service.unsetToken();
解决();
});
}
checkTokenValidity():承诺{
返回新承诺((解决、拒绝)=>{
this.service.get('/api/auth/validity')
.然后(()=>解析(true))
.catch(()=>resolve(false));
});
}
公共getUser(){
返回{…this.user};
}
}
的值由函数的调用方式(运行时)决定 绑定)

http对象上的http post方法在内部调用'request'方法,但当您获得post引用并调用它时,引用在严格模式下变得未定义

您可以直接使用http对象

  private request(route: string, method: string, requestOptions?: any): Promise<void> {
      return new Promise((resolve, reject) => {
          const url = new URL(route, this.host);
          const { payload, headers, options }: Options = requestOptions || {};
          const defaultHeaders = { 'Content-Type': 'application/json' };
          const token = localStorage.getItem('Token');
          if(token) { defaultHeaders['Authorization'] = token; }

          const optionsDefinition = {
                  ...options,
                  withCredentials: true,
                  headers: new HttpHeaders({...defaultHeaders, ...headers})
          };

          this.http[method.toLowerCase()](url.toString(), payload, optionsDefinition)
              .subscribe(() => {console.log('resolve'); resolve();},
                  () => {console.log('reject');reject(); });
      });
  }
演示 的值由函数的调用方式(运行时)决定 绑定)

http对象上的http post方法在内部调用'request'方法,但当您获得post引用并调用它时,引用在严格模式下变得未定义

您可以直接使用http对象

  private request(route: string, method: string, requestOptions?: any): Promise<void> {
      return new Promise((resolve, reject) => {
          const url = new URL(route, this.host);
          const { payload, headers, options }: Options = requestOptions || {};
          const defaultHeaders = { 'Content-Type': 'application/json' };
          const token = localStorage.getItem('Token');
          if(token) { defaultHeaders['Authorization'] = token; }

          const optionsDefinition = {
                  ...options,
                  withCredentials: true,
                  headers: new HttpHeaders({...defaultHeaders, ...headers})
          };

          this.http[method.toLowerCase()](url.toString(), payload, optionsDefinition)
              .subscribe(() => {console.log('resolve'); resolve();},
                  () => {console.log('reject');reject(); });
      });
  }

演示如何称呼“post”?您使用的函数似乎超出了其作用域,因此未定义“this”。@francadaval我使用依赖项注入将其导入另一个服务中(将其存储在
service
attribute),并以
this.service.post(…)
的形式调用post。您能在组件中调用此服务的位置共享代码吗?当然,我会编辑这个问题来插入这个。考虑使用HTTP拦截器和to诺言,你怎么称呼“POST”?您使用的函数似乎超出了其作用域,因此未定义“this”。@francadaval我使用依赖项注入将其导入另一个服务中(将其存储在
service
attribute),并以
this.service.post(…)
的形式调用post。您能在组件中调用此服务的位置共享代码吗?当然,我会编辑这个问题来插入这个。考虑使用HTTP拦截器和承诺instead@GabrielAlves很乐意帮助尼斯,我来看看。谢谢@加布里埃尔·阿尔维斯很乐意帮助尼斯,我来看看。谢谢