vue项目中的vue.config.js配置文件中的proxy代理post请求时报ECONNRESET错误

在Vue项目的开发环境中,遇到POST请求失败的问题。通过检查,接口本身及代理配置没有问题,推测可能是因为POST数据格式导致。解决方案是在vue.config.js中添加onProxyReq方法,处理请求体的数据格式,将Content-Type更改为application/json并正确设置Content-Length,确保数据能被正确发送到API服务器。最终,问题得到解决,POST请求成功完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、问题

错误如下所示:
在这里插入图片描述
在这里插入图片描述
vue.config.js中的代理配置如下:

devServer: {
	proxy: {
      // change xxx-api/login => mock/login
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      '/ecustom': {
        target: 'http://xxx.xx.x.xxx:xx', //API服务器的地址
        // ws: true, //代理websockets
        changeOrigin: true, // 是否跨域,虚拟的站点需要更管origin
        pathRewrite: {
          // '^/api5'是一个正则表达式,表示要匹配请求的url中,全部'http://localhost:8081/api5' 转接为 http://localhost:8081/api/
          '^/ecustom': '',
        },
        logLevel: 'debug' // 打印调试信息
      },
   }
}

2、分析

(1)在postman上测试接口,数据能正常返回,说明接口是没问题。
(2)代理了get请求也能够请求成功,说明代理配置上也是没问题的。
(3)猜测可能是代理后post的数据格式上有问题。

3、解决

配置onProxyReq去处理返回的数据。
vue-config.js中的代理配置代码如下:

devServer: {
    proxy: {
      '/ecustom': {
        target: 'http://xxx.xx.x.xxx:xx', //API服务器的地址
        // ws: true, //代理websockets
        changeOrigin: true, // 是否跨域,虚拟的站点需要更管origin
        onProxyReq: function (proxyReq, req, res, options) {
          if (req.body) {
            let bodyData = JSON.stringify(req.body);
            // incase if content-type is application/x-www-form-urlencoded -> we need to change to application/json
            proxyReq.setHeader('Content-Type','application/json');
            proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData));
            // stream the content
            proxyReq.write(bodyData);
          }
        },
        pathRewrite: {
          // '^/api5'是一个正则表达式,表示要匹配请求的url中,全部'http://localhost:8081/api5' 转接为 http://localhost:8081/api/
          '^/ecustom': '',
        },
        logLevel: 'debug' // 打印调试信息
      },
    }
  },

4、结果

在这里插入图片描述

<think>嗯,用户问的是在Vue项目中,vue.config.js里哪些部分是用来配置Webpack的。我需要先回忆一下Vue CLI和Webpack的关系。Vue CLI内部封装了Webpack,而vue.config.js允许用户自定义配置。接下来,我得想清楚各个配置项对应的Webpack部分。 首先,configureWebpack这个属性,用户可以用对象或者函数来修改Webpack配置。如果是对象,它会合并到默认配置里;函数的话,可以直接修改配置对象。这应该是最直接的部分。 然后是chainWebpack,允许通过链式操作更细粒度地调整配置。比如修改loader选项或者插件。可能用户需要知道如何使用链式API,比如config.module.rule('vue')这样的例子。 接下来,devServer应该对应Webpack的devServer配置,用来设置代理、端口之类的。这部分用户可能经常需要配置,特别是跨域代理的问题。 还有css相关的配置,比如loaderOptions,这里可以传递给CSS相关的loader,比如postcss、sass等。虽然CSS处理是Webpack的一部分,但用户可能不太清楚这些选项具体对应哪个loader。 pluginOptions可能不是直接配置Webpack,而是给Vue CLI插件用的,但有时候插件本身可能会影响Webpack配置,所以需要提一下,但说明它不直接对应Webpack配置。 其他如productionSourceMap、publicPath、outputDir这些,虽然影响构建输出,但属于Vue CLI的配置项,不是直接修改Webpack。不过publicPath对应output.publicPath,outputDir对应output.path,可能需要指出它们的对应关系。 需要确保用户明白哪些配置项直接映射到Webpack的哪些部分,哪些是Vue CLI特有的。另外,要提醒他们查看文档,使用正确的方式修改配置,避免直接覆盖整个配置对象导致问题。可能还需要给出示例,比如如何添加loader或插件,这样用户更容易理解。</think>在 Vue CLI 项目中,`vue.config.js` 中与 Webpack 相关的配置主要包含以下几个核心部分: ```javascript module.exports = { // ================== Webpack 核心配置 ================== configureWebpack: { // 直接合并到最终 Webpack 配置(对象形式) // 相当于 webpack.config.js 中的配置 resolve: { alias: { '@': path.resolve(__dirname, 'src') } }, plugins: [new MyWebpackPlugin()] }, // ================== 链式配置 Webpack ================== chainWebpack: (config) => { // 使用 webpack-chain 语法修改配置 config.module .rule('vue') .use('vue-loader') .tap(options => ({ ...options, compilerOptions: { preserveWhitespace: false } })) }, // ================== 开发服务器配置 ================== devServer: { // 对应 webpack-dev-server port: 8080, proxy: { '/api': { target: 'http://localhost:3000', changeOrigin: true } } }, // ================== CSS 相关配置 ================== css: { loaderOptions: { // 传递给 CSS 相关 loader sass: { prependData: `@import "@/styles/variables.scss";` }, postcss: { plugins: [require('autoprefixer')()] } } }, // ================== 高级 Webpack 配置 ================== productionSourceMap: false, // 关闭生产环境 source map filenameHashing: true, // 控制文件名哈希 parallel: require('os').cpus().length > 1 // 是否启用多线程构建 } ``` ### 关键配置说明: 1. **configureWebpack**(最常用) - 类型:`对象 | 函数` - 作用:直接合并/修改 Webpack 配置 - 示例场景: ```javascript configureWebpack: { plugins: [new BundleAnalyzerPlugin()], externals: { lodash: '_' // 排除外部依赖 } } ``` 2. **chainWebpack**(更细粒度控制) - 类型:`函数` - 特点:使用 [webpack-chain](https://github.com/neutrinojs/webpack-chain) 语法 - 示例场景: ```javascript chainWebpack: config => { config.optimization.splitChunks({ cacheGroups: { vendor: { test: /[\\/]node_modules[\\/](lodash|moment)[\\/]/, name: 'vendors-lodash-moment' } } }) } ``` 3. **devServer** - 对应 webpack-dev-server 配置 - 常用场景:配置 API 代理、HTTPS、端口等 4. **css.loaderOptions** - 配置 CSS 预处理器参数(Sass/Less/Stylus) - 示例场景:全局注入 SCSS 变量 ### 注意事项: 1. 优先使用 Vue CLI 的**高级配置项**(如`publicPath`、`outputDir`),而不是直接修改 Webpack 配置 2. 修改 Webpack 配置前,建议先查看 [Vue CLI 文档](https://cli.vuejs.org/zh/config/) 确认是否有现成的配置项 3. 使用 `vue inspect > output.js` 命令可输出最终 Webpack 配置 ### 典型场景示例: ```javascript // 添加新的 loader chainWebpack: config => { config.module .rule('yaml') .test(/\.ya?ml$/) .use('yaml-loader') .loader('yaml-loader') .end() } // 修改现有 loader chainWebpack: config => { config.module .rule('svg') .exclude.add(resolve('src/icons')) .end() } ``` 建议通过渐进式配置:先尝试 Vue CLI 的顶层配置,必要时再使用底层 Webpack 配置。保持配置的简洁性和可维护性。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值