近期 nuxt 开发遇到的问题

2019-07-02  本文已影响0人  Howie126313

查看服务端请求

在拦截器中执行 vuex 中的 saveRequest 方法存储请求相关内容,此处使用 lodash 的节流函数防止频繁的请求带来性能问题的可能。

export default ({ app, store, redirect, $axios }, inject) => {
  // http响应拦截器
  $axios.interceptors.response.use(data => {
    const fn = app.lodash.throttle((o) => {
      store.commit('debug/saveRequest', o)
    }, 100)
    let obj = {
      method: data && data.request && data.request.method ? data.request.method : '',
      path: process && process.env && process.env.baseUrl && data && data.request? process.env.baseUrl + data.request.path : '',
      params: data && data.config && data.config.data ? data.config.data : '',
      data: data && data.data ? data.data : ''
    }
    if (obj.data) {
      fn(obj)
    }
    return data
  }, error => {
    return Promise.reject(error)
  })
}

Note: 使用 proxy 的时候需要注意,baseURL 和 proxy 不能一起工作,需要使用 prefix 代替。同时,与正常的 axios 不同的是还有一个 browserBaseURL 参数默认值是 baseURL(当 options.proxy 开启时为 prefix), 文档 中有详细的解释。

nuxtServerInit 中发送请求

需要在每个页面初始化之前获取需要的 uesrId,nuxtServerInit 应该是一个很好的位置。nuxtServerInit中服务端调用时,上下文对象会作为第二个参数接收。

export const state = () => ({
  cityCode: null
})

export const actions = {
  async nuxtServerInit ({ commit, dispatch }, { req, route, redirect, $axios }) {
      userId = await dispatch('getUserId')
  },
  async getUserId ({ commit, state }) {
    try {
      let userId = await $axios.$post('http://tim.server.xxx.com/getWebUserId', {cityCode: state.cityCode, sourceClient: 'wap'})
      return userId && userId.result ? userId.result.rongyunUserId : ''
    } catch (err) {
      console.err('nuxtServerInit 获取 id 报错', err)
    }
  }
}

封装服务端使用的通用方法

在 plugins 中新建一个插件,将方法挂载在 app 上,使用时 app.$Function 调用。在 plugins 中可以通过 export default function(context) 中的参数获取上下文对象

export default ({ app }, inject) => {
  // 转化参数,去掉参数中的 null 和 空值
  function transformParameters (o) {
    let res = {}
    for(let [key, val] of Object.entries(o)) {
      if (val) {
        res[key] = val
      }
    }
    return res
  }
  app.transformParameters = transformParameters
}
上一篇 下一篇

猜你喜欢

热点阅读