Skip to content
/ nexusjs Public

Promise based HTTP/1.1 HTTP/2.0 client with ZSTD support for NodeJS.. Inspired in AXIOS (only for server-side)

License

Notifications You must be signed in to change notification settings

kaykyr/nexusjs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation


Promise based HTTP/1.1 HTTP/2.0 client with ZSTD support for NodeJS (only for server-side). I've created it for my personal usage in a specific project so, I decided to share code with the community. I hope this can help anyone.

npm version Gitpod Ready-to-Code install size npm bundle size npm downloads gitter chat Known Vulnerabilities

Features

  • Make http and http2 requests from node.js
  • Supports the Promise API
  • Intercept response
  • Decompress ZSTD response
  • Transform request and response data
  • Automatic transforms for JSON data

Installing

Package manager

Using npm:

$ npm install nexus-request

Using yarn:

$ yarn add nexus-request

Once the package is installed, you can import the library using import or require approach:

import { Nexus, NexusException } from './libs/nexusjs/src/src'

You can also use the default export, since the named export is a export of Nexus class instance calling rawRequest method:

import nexus from './libs/nexusjs/src/src'

const response = await nexus('https://httpbin.org/post', {
    method: 'post',
    http2: true,
    proxy: 'http://127.0.0.1:8080',
    setURLEncoded: false,
    response: {
        transformJson: true,
        stringifyBigInt: true,
        forceCamelCase: true,
    },
})

console.log('Response: ', response.data)

Example

Note CommonJS usage In order to gain the TypeScript typings (for intellisense / autocomplete) while using CommonJS imports with require(), use the following approach:

import { Nexus } from './libs/nexusjs/src/src'

const nexus = new Nexus()

// Make a request for a user with a given ID
nexus.get('/user?ID=12345')
  .then(function (response) {
    // handle success
    console.log(response)
  })
  .catch(function (error) {
    // handle error
    console.log(error)
  })
  .finally(function () {
    // always executed
  })

// Make a request for a user with a given ID (Nexus Way)
nexus.get('/user')
  .addParam('ID', 12345)
  .then(function (response) {
    // handle success
    console.log(response)
  })
  .catch(function (error) {
    // handle error
    console.log(error)
  })
  .finally(function () {
    // always executed
  })

// Optionally the request above could also be done as
nexus.get('/user', {
    params: {
      ID: 12345
    }
  })
  .then(function (response) {
    console.log(response)
  })
  .catch(function (error) {
    console.log(error)
  })
  .finally(function () {
    // always executed
  })

// Want to use async/await? Add the `async` keyword to your outer function/method.
async function getUser() {
  try {
    const response = await nexus.get('/user').addParam('ID', 12345)
    console.log(response)
  } catch (error) {
    console.error(error)
  }
}

Note async/await is part of ECMAScript 2017 and is not supported in Internet Explorer and older browsers, so use with caution.

Performing a POST request

nexus.post('/user')
  .addPost('firstName', 'Fred')
  .addPost('lastName', 'Flintstone')
  .then(function (response) {
    console.log(response)
  })
  .catch(function (error) {
    console.log(error)
  })

// Optionally the request above could also be done as
nexus.post('/user', {
    data: {
        firstName: 'Fred',
        lastName: 'Flintstone'
    }
  })
  .then(function (response) {
    console.log(response)
  })
  .catch(function (error) {
    console.log(error)
  })

Performing multiple concurrent requests

function getUserAccount() {
  return nexus.get('/user/12345')
}

function getUserPermissions() {
  return nexus.get('/user/12345/permissions')
}

Promise.all([getUserAccount(), getUserPermissions()])
  .then(function (results) {
    const acct = results[0]
    const perm = results[1]
  })

Nexus API

Requests can be made by passing the relevant config to nexus.

nexus(url, config)
// Send a POST request
import nexus from './libs/nexusjs/src/src'

nexus('https://httpbin.org/post', {
  method: 'post',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
})

Creating an instance

You can create a new instance of nexus with a custom config.

nexus.create([config])
import { Nexus } from './libs/nexusjs/src/src'

const instance = new Nexus({
  baseURL: 'https://httpbin.org/',
  headers: {'X-Custom-Header': 'foobar'},
  response: {
    transformJson: true,
    stringifyBigInt: true,
    forceCamelCase: true,
  }
});

Instance methods

The available instance methods are listed below. The specified config will be merged with the instance config.

nexus#get(url[, config])
nexus#delete(url[, config])
nexus#post(url[, data[, config]])
nexus#put(url[, data[, config]])

Request Config

These are the available config options for making requests. Only the url is required. Requests will default to GET if method is not specified.

{
  // `url` is the server URL that will be used for the request
  url | path: '/user',

  // `method` is the request method to be used when making the request
  method: 'get', // default

  // `baseURL` will be prepended to `url` unless `url` is absolute.
  // It can be convenient to set `baseURL` for an instance of nexus to pass relative URLs
  // to methods of that instance.
  baseURL: 'https://some-domain.com/api/',

  // `transformResponse` allows changes to the response data to be made before
  // it is passed to then/catch
  responseTransformer: [function (data) {
    // Do whatever you want to transform the data

    return data;
  }],

  // `headers` are custom headers to be sent
  headers: {'X-Requested-With': 'XMLHttpRequest'},

  // `params` are the URL parameters to be sent with the request
  // Must be a plain object or a URLSearchParams object
  params: {
    ID: 12345
  },

  // `data` is the data to be sent as the request body
  // Only applicable for request methods 'PUT', 'POST', 'DELETE , and 'PATCH'
  // When no `transformRequest` is set, must be of one of the following types:
  // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
  // - Browser only: FormData, File, Blob
  // - Node only: Stream, Buffer, FormData (form-data package)
  data: {
    firstName: 'Fred'
  },

  // syntax alternative to send data into the body
  // method post
  // only the value is sent, not the key
  data: 'Country=Brasil&City=Belo Horizonte',


  // `responseEncoding` indicates encoding to use for decoding responses (Node.js only)
  // Note: Ignored for `responseType` of 'stream' or client-side requests
  encoding: 'utf8', // default

  // `proxy` defines the hostname, port, and protocol of the proxy server.
  // You can also define your proxy using the conventional `http_proxy` and
  // `https_proxy` environment variables. If you are using environment variables
  // for your proxy configuration, you can also define a `no_proxy` environment
  // variable as a comma-separated list of domains that should not be proxied.
  // Use `false` to disable proxies, ignoring environment variables.
  // `auth` indicates that HTTP Basic auth should be used to connect to the proxy, and
  // supplies credentials.
  // This will set an `Proxy-Authorization` header, overwriting any existing
  // `Proxy-Authorization` custom headers you have set using `headers`.
  // If the proxy server uses HTTPS, then you must set the protocol to `https`.
  proxy: 'http://user:pass@host:port',

  // `decompress` indicates whether or not the response body should be decompressed
  // automatically. If set to `true` will also remove the 'content-encoding' header
  // from the responses objects of all decompressed responses
  // - Node only (XHR cannot turn off decompression)
  decompress: true // default
}

Response Schema

The response for a request contains the following information.

{
  // `data` is the response that was provided by the server
  data: {},

  // `status` is the HTTP status code from the server response
  statusCode: 200,

  // `statusText` is the HTTP status message from the server response
  statusText: 'OK',

  // `headers` the HTTP headers that the server responded with
  // All header names are lowercase and can be accessed using the bracket notation.
  // Example: `response.headers['content-type']`
  headers: {},

  // `config` is the config that was provided to `nexus` for the request
  data: {},
}

Nexus Response Exception Schema

The response for a request contains the following information.

{
  // `data` is the response that was provided by the server
  data: {},

  // `status` is the HTTP status code from the server response
  statusCode: 200,

  // `statusText` is the HTTP status message from the server response
  statusText: 'OK',

  // `headers` the HTTP headers that the server responded with
  // All header names are lowercase and can be accessed using the bracket notation.
  // Example: `response.headers['content-type']`
  headers: {},

  // `config` is the config that was provided to `nexus` for the request
  data: {},

  // `request` is the request that generated this response
  // It is the last ClientRequest instance in node.js (in redirects)
  // and an XMLHttpRequest instance in the browser
  request: {}
}

License

MIT