Universal HTTP Module for Nuxt.js
 
 
Go to file
Pooya Parsa 4c9ff4dddf moved from nuxt-community/modules 2017-08-13 15:52:10 +04:30
src moved from nuxt-community/modules 2017-08-13 15:52:10 +04:30
test moved from nuxt-community/modules 2017-08-13 15:52:10 +04:30
.editorconfig moved from nuxt-community/modules 2017-08-13 15:52:10 +04:30
.eslintrc.js moved from nuxt-community/modules 2017-08-13 15:52:10 +04:30
.gitignore moved from nuxt-community/modules 2017-08-13 15:52:10 +04:30
CHANGELOG.md moved from nuxt-community/modules 2017-08-13 15:52:10 +04:30
README.md moved from nuxt-community/modules 2017-08-13 15:52:10 +04:30
package.json moved from nuxt-community/modules 2017-08-13 15:52:10 +04:30
yarn.lock moved from nuxt-community/modules 2017-08-13 15:52:10 +04:30

README.md

Axios

npm npm (scoped with tag)

Secure and Easy axios integration with Nuxt.js

Features

  • Automatically set base URL for client & server side
  • Exposes setToken function to $axios so we can easily and globally set authentication tokens.
  • Throws nuxt-friendly errors and optionally redirect on specific error codes.
  • Automatically enables withCredentials when requesting to base URL.
  • Proxy request headers in SSR.
  • Fetch style requests
  • And more

Setup

  • Add @nuxtjs/axios dependency using yarn or npm to your project
  • Add @nuxtjs/axios to modules section of nuxt.config.js
{
  modules: [
    // Simple usage
    '@nuxtjs/axios',

    // With options
    ['@nuxtjs/axios', { credentials: false }],
 ],

  // You can optionally use global options instead of inline form
  axios: {
    credentials: false
  }
}

Usage

Component asyncData

async asyncData({ app }) {
  const {data} = await app.axios.get('http://icanhazip.com')
  return {
    ip: data
  }
}

Store nuxtServerInit

async nuxtServerInit ({ commit }, { app }) {
  const ip = await app.axios.$get('http://icanhazip.com')
  commit('SET_IP', ip)
}

Store actions

If you need axios instance in store actions, you may have to pass it when dispatching.

// In components
export default {
  methods: {
    updateIP() {
      this.$store.dispatch('getIP', { axios: this.$axios })
    }
  }
}

// In store
{
  actions: {
    async getIP ({ commit }, { axios }) {
      const ip = await axios.$get('http://icanhazip.com')
      commit('SET_IP', ip)
    }
  }
}

Options

You can pass options using module options or axios section in nuxt.config.js

baseURL

  • Default: http://[HOST]:[PORT]/api

Base URL is required for requests in server-side & SSR and prepended to all requests with relative path. You can also use environment variable API_URL which overrides baseURL.

browserBaseURL

  • Default: /api

Base URL which is used in client side prepended to all requests with relative path. You can also use environment variable API_URL_BROWSER which overrides browserBaseURL.

  • If browserBaseURL is not provided it defaults to baseURL value.
    • If hostname & port of browserbaseURL are equal to nuxt server, it defaults to relative part of baseURL. So if your nuxt application is being accessed under a different domain, requests go to same origin and prevents Cross-Origin problems.

credentials

  • Default: true

Adds an interceptor to automatically set withCredentials config of axios when requesting to baseUrl which allows passing authentication headers to backend.

debug

  • Default: false

Adds interceptors to log all responses and requests

proxyHeaders

  • Default: true

In SSR context, sets client request header as axios default request headers. This is useful for making requests which need cookie based auth on server side. Also helps making consistent requests in both SSR and Client Side code.

redirectError

  • Default: {}

This option is a map from specific error codes to page which they should be redirect. For example if you want redirecting all 401 errors to /login use:

{
  axios: {
    redirectError: {
      401: '/login'
    }
  }
}

requestInterceptor

  • Default: null

Function for manipulating axios requests. Useful for setting custom headers, for example based on the store state. The second argument is the nuxt context.

requestInterceptor: (config, { store }) => {
  if (store.state.token) {
    config.headers.common['Authorization'] = store.state.token
  }
  return config
}

Helpers

Fetch Style requests

Axios plugin also supports fetch style requests with $ prefixed methods:

// Normal usage with axios
let data = (await axios.get('...')).data

// Fetch Style
let data = await axios.$get('...')

setHeader(name, value, scopes='common')

Axios instance has a helper to easily set any header.

Parameters:

  • name: Name of the header
  • value: Value of the header
  • scopes: Send only on specific type of requests. Defaults
    • Type: Array or String
    • Defaults to common meaning all types of requests
    • Can be get, post, delete, ...
// Adds header: `Authorization: 123` to all requests
this.$axios.setHeader('Authorization', '123')

// Overrides `Authorization` header with new value
this.$axios.setHeader('Authorization', '456')

// Adds header: `Content-Type: application/x-www-form-urlencoded` to only post requests
this.$axios.setHeader('Content-Type', 'application/x-www-form-urlencoded', ['post'])

// Removes default Content-Type header from `post` scope
this.$axios.setHeader('Content-Type', false, ['post'])

setToken(token, type, scopes='common')

Axios instance has an additional helper to easily set global authentication header.

Parameters:

  • token: Authorization token
  • type: Authorization token prefix(Usually Bearer).
  • scopes: Send only on specific type of requests. Defaults
    • Type: Array or String
    • Defaults to common meaning all types of requests
    • Can be get, post, delete, ...
// Adds header: `Authorization: 123` to all requests
this.$axios.setToken('123')

// Overrides `Authorization` header with new value
this.$axios.setToken('456')

// Adds header: `Authorization: Bearer 123` to all requests
this.$axios.setToken('123', 'Bearer')

// Adds header: `Authorization: Bearer 123` to only post and delete requests
this.$axios.setToken('123', 'Bearer', ['post', 'delete'])

// Removes default Authorization header from `common` scope (all requests)
this.$axios.setToken(false)

Dynamic API Backend

Please notice that, API_URL is saved into bundle on build, CANNOT be changed on runtime! You may use proxy module for dynamically route api requests to different backend on test/staging/production.

Example: (nuxt.config.js)

{
  modules: [
    '@nuxtjs/axios',
    '@nuxtjs/proxy'
 ],
  proxy: [
    ['/api', { target: 'http://www.mocky.io', pathRewrite: { '^/api': '/v2' } }]
  ]
}

Start Nuxt

[AXIOS] Base URL: http://localhost:3000/api | Browser: /api
[HPM] Proxy created: /api  ->  http://www.mocky.io
[HPM] Proxy rewrite rule created: "^/api" ~> "/v2"

Now you can make requests to backend: (Works fine in both SSR and Browser)

async asyncData({app}) {
  // Magically makes request to http://www.mocky.io/v2/59388bb4120000dc00a672e2
  const nuxt = await app.axios.$get('59388bb4120000dc00a672e2')

  return {
    nuxt // -> { nuxt: 'Works!' }
  }
}

Details

  • '@nuxtjs/axios'

    • By default axios plugin sets base url to http://[host]:[port]/api which is http://localhost:3000/api
  • '/api': 'http://www.mocky.io/v2'

    • This line creates a server middleware to pass requests from /api to http://www.mocky.io/v2
    • We used pathRewrite to remove /api from starting of requests and change it to /v2
    • For more information and advanced usage please refer to proxy docs.