nuxt中接口跨域代理失效的问题

在nuxt.js中引入@gauseen/nuxt-proxy模块解决接口跨域限制,但是页面访问报错

clipboard.png

nuxt.config.js配置如下

module.exports = {
    ...
    
    modules: [
        // 请求代理配置,解决跨域
        '@gauseen/nuxt-proxy',
    ],
    proxyTable: [
        '/api',
        {
            target: 'http://192.168.1.181:3004', // api主机
            ws: true,
            pathRewrite: { '^/api': '/' }
        }
    ]
     
    ...
}

axios请求如下

axios.post('/login', data)

但是把proxyTable这个注释掉就行了,页面回复访问,到底是什么原因引起的呢?有没有解决方案

阅读 9.6k
2 个回答

如果你翻出来vue-cli脚手架生成的vue项目,你会发现build/dev-server.js文件中有这么一段代码

// proxy api requests
Object.keys(proxyTable).forEach(function (context) {
  var options = proxyTable[context]
  if (typeof options === 'string') {
    options = { target: options }
  }
  app.use(proxyMiddleware(options.filter || context, options))
})

没错,你说的这个proxyTable 就是一个express的中间件,但是这个express中间件和nuxt的中间件又不一样。具体怎么添加进去,貌似官方也没有说明。nuxt本地开发的时候貌似也是用的express。


经过我一番努力,终于把你这个东西弄出来了。在nuxt中如何添加express中间件?

首先,安装依赖
npm install --save-dev express http-proxy-middleware
然后在根目录创建一个文件server.js
const { Nuxt, Builder } = require('nuxt')
const app = require('express')()
var proxyMiddleware = require('http-proxy-middleware')
var config = require('./nuxt.config')
// 我们用这些选项初始化 Nuxt.js:
const isProd = process.env.NODE_ENV === 'production'
const nuxt = new Nuxt({ dev: !isProd })
// 生产模式不需要 build
if (!isProd) {
  const builder = new Builder(nuxt)
  builder.build()
}

// proxy api requests这里就是添加的proxyTable中间价的设置了
var proxyTable = config.dev.proxyTable
Object.keys(proxyTable).forEach(function (context) {
    var options = proxyTable[context]
    if (typeof options === 'string') {
      options = { target: options }
    }
    app.use(proxyMiddleware(options.filter || context, options))
  })
app.use(nuxt.render)//这里是添加nuxt渲染层服务的中间件



app.listen(3000)
console.log('Server is listening on http://localhost:3000')
然后在nuxt.config.js中添加如下代码
module.exports = {
    dev: {
    proxyTable: {
          '/api':
            {
                target: 'http://localhost:7001', // 
                pathRewrite: { '^/api': '/' }
            }
        }
      }
}

然后node server.js运行就可以了。
觉得运行不方便还可以把命令添加到package.json文件里。

{
     "scripts": {
        "dev": "nuxt --port=8080",
        "build": "nuxt build",
        "start": "nuxt start",
        "generate": "nuxt generate",
        "lint": "eslint --ext .js,.vue --ignore-path .gitignore .",
        "precommit": "npm run lint",
        "server": "node server.js"
    }
}
新手上路,请多包涵
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题