Javascript 无法读取属性';请求';未定义的
我目前正在为angular应用程序实现一个基本服务。这应该为其他服务提供方法,以便使用默认头和默认选项组合请求。当我尝试调用get或post方法时,就会出现问题。这些方法只是调用this.request,但我得到了一个带有此错误的ZoneAwarePromiseJavascript 无法读取属性';请求';未定义的,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)
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很乐意帮助尼斯,我来看看。谢谢@加布里埃尔·阿尔维斯很乐意帮助尼斯,我来看看。谢谢