NodeJS 如何在NestJS中为第三方API请求创建公共类

lnlaulya  于 2023-01-01  发布在  Node.js
关注(0)|答案(1)|浏览(884)

我正在创建一个NestJS应用程序,在那里我发出第三方API请求。为此,我必须在每个函数中编写相同的内容,以便获取数据。
为了使事情不重复,我如何编写具有基于GET或POST请求的API请求的公共类,并发送响应,以便我可以在每个函数中使用该类。
下面是我的代码:

    • 订阅服务ts**
@Injectable()
export class SubscribeService {
constructor(@InjectModel('Subscribe') private readonly model:Model<Subscribe>,
            @Inject(CACHE_MANAGER) private cacheManager:Cache,
            private httpService: HttpService){}

 async addSubscriber(subscriberDto:SubscribeDto){
     
    const url = 'https://track.cxipl.com/api/v2/phone-tracking/subscribe';  
    const headersRequest = {
        'content-Type': 'application/json',
        'authkey': process.env.AUTHKEY
    };

    try{

        const resp = await this.httpService.post(url,subscriberDto,{ headers: headersRequest }).pipe(
            map((response) => {

                if(response.data.success == true){
                     const data = new this.model(subscriberDto);
                    // return data.save();
                    const saved = data.save();
                    if(saved){
                        const msgSuccess = {
                                         "success":response.data.success,
                                         "status":response.data.data.status
                                       }
                        return msgSuccess;
                    }
                }
                else{
                    const msgFail = {"success":response.data.success}
                    return msgFail;
                }
            }),
          );
        return resp;
    }
    catch(err){
        return err;
    }
}

 async getLocation(phoneNumber:PhoneNumber){
   
    try{
        
        const location = await this.cacheManager.get<Coordinates>(phoneNumber.phoneNumber);
       
        if(location){
            return location; 
        }
        else{
         
        const resp = await axios.post('https://track.cxipl.com/api/v2/phone-tracking/location',phoneNumber,{headers:{
            'content-Type': 'application/json',
            'authkey': process.env.AUTHKEY
        }});
       
        const msg:Coordinates = {
                                  "location":resp.data.data.location,
                                  "timestamp":resp.data.data.timestamp
                                }
        await this.cacheManager.set<Coordinates>(phoneNumber.phoneNumber,msg, { ttl: 3600 });
        return msg;
        }
     }
     catch(err){
        console.log(err); 
        return err;
     }
   }
}

在上面的代码中,在addSubscriber()getLocation()函数中,我需要反复点击API,并一次又一次地添加请求头,有没有什么方法可以让我为请求和响应创建一个单独的类,并在我的服务中使用。
我怎样才能达到预期的效果?

vkc1a9a2

vkc1a9a21#

要在NestJS中创建一个用于发出第三方API请求的公共类,可以执行以下步骤:
1.在NestJS项目中创建一个新文件来存储公共类,例如,可以在src/common目录中创建一个名为API.service.ts的文件。
1.在该文件中,创建一个名为ApiService的新类,该类将负责发出API请求,该类应该有一个构造函数来注入必要的依赖项,例如NestJS提供的HttpService。

import { HttpService, Injectable } from '@nestjs/common';

@Injectable()
export class ApiService {
  constructor(private readonly httpService: HttpService) {}
}

1.为要发出的每种类型的API请求向ApiService类添加方法。例如,您可能有一个get()方法用于发出GET请求,一个post()方法用于发出POST请求,等等。每个方法都应接受发出请求所需的参数(如URL和任何查询参数或请求正文),并使用HttpService发出请求。

import { HttpService, Injectable } from '@nestjs/common';

@Injectable()
export class ApiService {
   constructor(private readonly httpService: HttpService) {}

   async get(url: string, params?: object): Promise<any> {
     return this.httpService.get(url, { params }).toPromise();
   }

   async post(url: string, body: object): Promise<any> {
     return this.httpService.post(url, body).toPromise();
   }
 }

1.在需要发出API请求的任何地方注入ApiService。例如,您可以将其注入到服务或控制器中,并使用ApiService的方法发出实际的API请求。

import { Injectable } from '@nestjs/common';
import { ApiService } from './api.service';

@Injectable()
export class SomeService {
  constructor(private readonly apiService: ApiService) {}

  async getData(): Promise<any> {
    return this.apiService.get('https://some-api.com/endpoint');
  }
}

这只是在NestJS中创建用于发出第三方API请求的公共类的一种方法。

相关问题