だから私はおそらく何かを逃したり、何か間違ったことをしている。外部APIにHTTPリクエストを送信しようとしているNestJSアプリケーションがあります。この発信要求を傍受し、実行する前にヘッダーを変更できるようにしたいのですが。
インターセプターを使用して無用に試しましたが、着信HTTPリクエストはインターセプトされますが、発信されません。任意の提案や助けをいただければ幸いです。
外部API呼び出しを使用する例を示すことができます。
import { PaginateModel, PaginateResult, Document } from 'mongoose';
import { AxiosInstance } from 'axios';
import { UseGuards, InternalServerErrorException, Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { Context } from './decorators/ctx.decorator';
@Injectable()
@UseGuards(AuthGuard('jwt'))
export abstract class ServiceBase<T extends Document> {
protected abstract readonly path: string;
constructor(protected readonly externals: Object, protected readonly model: PaginateModel<T>) {}
async create(data: T, ctx: Context): Promise<T> {
try {
this.validate(data);
const { lng, core } = this.separate(data);
const catalog = new this.model(core);
const head = await catalog.save();
Object.assign(head, lng);
const Authorization = ctx.token;
const axios: AxiosInstance = this.externals[ctx.lang];
try {
const resp = await axios.post(`${this.path}`, head, { headers: { Authorization } });
return resp.data;
} catch (err) {
// in case of any error the head record should be removed.
catalog.remove();
throw err;
}
} catch (err) {
console.log(err);
throw new InternalServerErrorException(err);
}
}
abstract async validate(data: T): Promise<any>;
abstract separate(data: T);
async update(id: string, data: T, ctx: Context): Promise<T> {
try {
const curr = await this.model.findById(id).exec();
const { lng, core } = this.separate(data);
Object.assign(curr, core);
await curr.save();
Object.assign(core, lng);
const Authorization = ctx.token;
const axios: AxiosInstance = this.externals[ctx.lang];
const resp = await axios.put(`${this.path}/${id}`, core, { headers: { Authorization } });
return resp.data;
} catch (err) {
throw new InternalServerErrorException(err);
}
}
async get(id: string, ctx: Context): Promise<T> {
try {
const Authorization = ctx.token;
const axios: AxiosInstance = this.externals[ctx.lang];
const resp = await axios.get(`${this.path}/${id}`, { headers: { Authorization } });
return resp.data;
} catch (err) {
console.log(err);
return null;
}
}
async findOne(query: object): Promise<T> {
const data = await this.model.findOne(query, { _class: 0 }).exec();
return data;
}
async findAll(ctx: Context): Promise<T[]> {
try {
const Authorization = ctx.token;
const axios: AxiosInstance = this.externals[ctx.lang];
const resp = await axios.get(`${this.path}`, {
headers: { Authorization },
});
return resp.data;
} catch (err) {
console.log(err);
return null;
}
}
async find(query: {} = {}, page: number, rows: number, ctx: Context): Promise<PaginateResult<T>> {
try {
const Authorization = ctx.token;
const axios: AxiosInstance = this.externals[ctx.lang];
const resp = await axios.get(`${this.path}`, {
params: { page, rows },
headers: { Authorization },
});
return resp.data;
} catch (err) {
console.log(err);
return null;
}
}
}
ここで、外観は次のとおりです。
import axios, { AxiosInstance } from 'axios';
const config = require('../../config/settings.json');
export const externalProviders = {
provide: 'ExternalToken',
useFactory: () => {
const externals = {};
for (const lang in config.externals) {
externals[lang] = axios.create({
baseURL: config.externals[lang],
});
}
return externals;
}
};