nuxtjs - 全局共享的可编辑服务器变量

nuxtjs - global shared editable server variables

我正在使用 nuxtjs,并且我使用针对 restful API 的应用程序身份验证。我想在服务器端变量中存储我的令牌,我到处使用它向 API 请求信息,但我不能将它存储在 process.env 变量中,因为我需要在它过期时修改它(在1小时)。令牌是针对应用程序的,而不是针对用户的,因此每次调用 api 都必须使用相同的令牌。我尝试使用 fs 将我的令牌保存在 json 文件中并在它过期时刷新它,但是我不能在 nuxtjs 中使用 fs,它告诉我 fs 不存在,可能是因为我尝试在中使用它客户端。 你知道我该怎么做吗? 谢谢

我通过在服务器端环境中使用 express 解决了,我不得不将服务器中间件配置放在 nuxt.config.js:

const bodyParser = require('body-parser')
const session = require('express-session')

module.exports = {    
...
  serverMiddleware: [
    bodyParser.json(),
    session({
      secret: 'my-secret',
      resave: false,
      saveUninitialized: false,
      cookie: { maxAge: 3600000 }
    }),
    '~/server'
  ],
...

以及 /server/index.js 文件:

const express = require('express')
const api = require('./api')

// Create express router
const router = express.Router()

// Transform req & res to have the same API as express
// So we can use res.status() & res.json()
var app = express()
router.use((req, res, next) => {
  Object.setPrototypeOf(req, app.request)
  Object.setPrototypeOf(res, app.response)
  req.res = res
  res.req = req
  next()
})

router.get('/myroute', (req, res) => {
  api.get('myroute')
    .then((data) => {
      res.json({success: true})
    })
    .catch((e) => {
      res.status(500).json({ message: 'An error occurred' })
    })
})

module.exports = {
  path: '/server',
  handler: router
}

和我的 /server/api.js 文件

const parameters = require('./parameters.js')
const router = require('./router.js')
const axios = require('axios')

const auth = {
  accessToken: null,
  expiresAt: null
}

const getToken = () => {
  const expiresAt = auth.expiresAt
  const accessToken = auth.accessToken

  const expires = expiresAt ? (new Date()).getTime() : null

  if (expires && expires - expiresAt > 0) {
    return new Promise((resolve, reject) => {
      resolve(accessToken)
    })
  }

  return new Promise((resolve, reject) => {
    axios.get(parameters.api + router.token, {
      params: parameters.auth
    })
      .then(({data}) => {
        auth.accessToken = data.access_token
        auth.expiresAt = (new Date()).getTime() + data.expires_in - 60
        resolve(data.access_token)
      })
      .catch((e) => {
        reject(e)
      })
  })
}

const getCompleteRoute = (route) => {
  return new Promise((resolve, reject) => {
    getToken()
      .then((token) => {
        resolve(parameters.api + router[route] + '?access_token=' + token)
      })
      .catch((e) => {
        reject(e)
      })
  })
}

const get = (route, params) => {
  return new Promise((resolve, reject) => {
    getCompleteRoute(route)
      .then((completeRoute) => {
        axios.get(completeRoute, {params: params})
          .then(({data}) => {
            resolve(data)
          })
          .catch((e) => {
            reject(e)
          })
      })
      .catch((e) => {
        reject(e)
      })
  })
}

const post = (route, params) => {
  return new Promise((resolve, reject) => {
    getCompleteRoute(route)
      .then((completeRoute) => {
        axios.post(completeRoute, params)
          .then(({data}) => {
            resolve(data)
          })
          .catch((e) => {
            reject(e)
          })
      })
      .catch((e) => {
        reject(e)
      })
  })
}

module.exports = {
  get: get,
  post: post
}