Skip to content

Files

Latest commit

7f9555f · Oct 29, 2020

History

History

http

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Jan 17, 2020
Jan 15, 2020
Jan 4, 2020
Jan 19, 2020
Jan 17, 2020
Jul 23, 2020
Jan 17, 2020
Jul 23, 2020
Jan 15, 2020
Jul 23, 2020
Dec 26, 2019
Jan 17, 2020
Oct 29, 2020
Dec 26, 2019

NestCloud - Http

NPM Version Package License NPM Downloads Travis Linux Coverage

Description

This is a Nest module for writing nestjs http clients easier.

Installation

$ npm i --save @nestcloud/http

Quick Start

Import Module

import { Module } from '@nestjs/common';
import { HttpModule } from '@nestcloud/http';

@Module({
  imports: [
      HttpModule.forRoot(),
  ],
})
export class AppModule {
}

Configurations

http:
  axios:
    timeout: 1000

Usage

import { Injectable } from "@nestjs/common";
import { Get, Query, Post, Body, Param, Put, Delete } from "@nestcloud/http";

@Injectable()
export class UserClient {
    @Get('http://test.com/users')
    getUsers(@Query('role') role: string) {
    }
    
    @Post('http://test.com/users')
    createUser(@Body('user') user: any) {
    }
    
    @Put('http://test.com/users/:userId')
    updateUser(@Param('userId') userId: string, @Body('user') user: any) {
    }
    
    @Delete('http://test.com/users/:userId')
    deleteUser(@Param('userId') userId: string) {
    }
}

Loadbalance

import { Injectable } from "@nestjs/common";
import { Loadbalanced, Get, Query } from "@nestcloud/http";

@Injectable()
// enable loadbalance supports, need import @nestcloud/loadbalance module at first.
@Loadbalanced('user-service')
export class UserClient {
    @Get('/users')
    getUsers(@Query('role') role: string) {
    }
    
    @Get('http://test.com/users')
    // disable loadbalance supports.
    @Loadbalanced(false)
    getRemoteUsers() {
    }
}

Interceptor

import { Injectable } from '@nestjs/common';
import { Interceptor } from "@nestcloud/http";
import { AxiosResponse, AxiosRequestConfig } from 'axios';

@Injectable()
export class AddHeaderInterceptor implements Interceptor {
    onRequest(request: AxiosRequestConfig): AxiosRequestConfig {
        request.headers['x-service'] = 'service-name';
        return request;
    }
    
    onResponse(response: AxiosResponse): AxiosResponse {
        return response;
    }
    
    onRequestError(error: any): any {
        return Promise.reject(error);
    }
    
    onResponseError(error: any): any {
        return Promise.reject(error);
    }
}
import { Injectable } from "@nestjs/common";
import { Get, UseInterceptors } from "@nestcloud/http";
import { AddHeaderInterceptor } from "./middlewares/AddHeaderInterceptor";

@Injectable()
@UseInterceptors(AddHeaderInterceptor)
export class ArticleClient {
    @Get('https://api.apiopen.top/recommendPoetry')
    getArticles() {
    }
}

examples:

@UseInterceptors(Interceptor1)
@UseInterceptors(Interceptor2)
export class Client {

    @UseInterceptors(Interceptor3)
    @UseInterceptors(Interceptor4)
    getArticles() {
    }
}

result:

interceptor1 request
interceptor2 request
interceptor3 request
interceptor4 request
interceptor4 response
interceptor3 response
interceptor2 response
interceptor1 response

Brakes

Import @nestcloud/brakes module at first.

import { Module } from '@nestjs/common';
import { BrakesModule } from '@nestcloud/brakes';

@Module({
  imports: [
      BrakesModule.forRoot(),
  ],
})
export class AppModule {
}

Write a fallback class.

import { Fallback } from '@nestcloud/brakes';
import { BadRequestException, Injectable } from '@nestjs/common';

@Injectable()
export class UserFallback implements Fallback {
  config() {
    return {};
  }

  fallback(...params) {
    throw new BadRequestException('fallback invoke');
  }

  healthCheck() {
  }
}

Use fallback.

import { Injectable } from '@nestjs/common';
import { Get } from '@nestcloud/http';
import { UseFallback } from '@nestcloud/brakes';
import { UserFallback } from './UserFallback';

@Injectable()
@UseFallback(UserFallback)
export class UserClient {
  @Get('/users')
  getUsers(): any {
  }
}

API

Get|Post|Put|Delete|Options|Head|Patch|Trace(uri: string, options?: AxiosRequestConfig): MethodDecorator

Route decorator.

field type description
uri string the url
options object axios config,see axios

Param|Body|Query|Header(field?: string): ParameterDecorator

Parameter decorator.

field type description
field string the field name

SetHeader|SetQuery|SetParam|SetBody(field: string, value: any): MethodDecorator

constant parameter decorator

field type description
field string the field name
value any the field value

Response(): MethodDecorator

If set this decorator, it will return full http response.

ResponseHeader(): MethodDecorator

If set this decorator, it will return response.headers.

ResponseBody(): MethodDecorator

It's a default decorator, it will return response.data.

ResponseType(type: string): MethodDecorator

set response data type, eg: 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream', default 'json'

ResponseEncode(type: string): MethodDecorator

Set response data encode, default 'utf8'

Loadbalanced(service: string | boolean): ClassDecorator | MethodDecorator

Open or close lb support.

UseInterceptors<T extends IInterceptor>(...interceptors: Function[])

Use interceptor, supports dynamic import and inject.

Stay in touch

License

NestCloud is MIT licensed.