我通过在服务器端环境中使用 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
}