Angular 6跨服务调用问题:Service1实例在Service2中未定义
问题分析与解决方案
嘿,我一眼就揪出问题所在了——你把fileChange方法直接定义在Service2的构造函数内部了!这就是为什么this.service总是undefined的核心原因:
- 这个方法不属于
Service2的类成员,当外部(比如组件)调用它时,this的上下文会丢失,自然找不到注入的service实例。 - 构造函数的职责是处理依赖注入和初始化操作,绝对不该用来定义业务逻辑方法。
修正后的代码
Service2 修正版
@Injectable({ providedIn: 'root' }) export class Service2 { // 依赖注入逻辑保留,这部分是正确的 constructor(private service: Service1) {} // 把fileChange移到这里,作为类的顶层成员方法 fileChange(event) { const formData: FormData = new FormData(); // 你的文件处理代码... this.service.uploadAttachments(formData).subscribe( resp => { if (resp === -1 ) { alert('Error occured while uploading the attachment'); return; } else { // 成功后的业务逻辑... } }, (error) => { console.log('POST ERROR in method uploadAttachments: ' + error.error); } ); } }
额外的优化与修复点
除了核心问题,还有两个细节需要调整:
Service1 中缺失的 baseURL
你的Service1里用到了this.baseURL,但代码里没看到它的定义,必须补充初始化,否则POST请求会指向无效地址:@Injectable({ providedIn: 'root' }) export class Service1 { // 替换成你的实际API基础地址 private baseURL = 'https://your-api-domain.com/'; constructor(private http: HttpClient) {} uploadAttachments(formData: any): any { // 下面是第二个修复点 const headers = new HttpHeaders() .append('Accept', 'application/json'); // 移除手动设置的multipart/form-data,Angular会自动处理! return this.http.post(`${this.baseURL}Data/UpdateInsertAttachments`, formData, {headers: headers}); } }错误的HttpHeaders设置
Angular的HttpHeaders是不可变对象,append方法会返回新的实例,你之前的写法其实没修改原headers。更重要的是:不要手动设置multipart/form-data的Content-Type——Angular会自动根据FormData生成带正确分隔符(boundary)的请求头,手动设置反而会导致后端无法解析表单数据。
总结
- 把业务方法从构造函数中移到类的成员位置,确保
this指向正确的服务实例。 - 修复
HttpHeaders的错误配置,移除手动的multipart/form-data设置。 - 确保
Service1中的baseURL已正确初始化。
内容的提问来源于stack exchange,提问作者Mr. Jay
相关产品推荐
相关产品推荐

