You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue+Express代理环境下Fetch请求始终无法完成的问题求助

Vue+Express代理环境下Fetch请求始终无法完成的问题求助

老哥我看了你的代码,发现几个关键问题导致请求一直卡着不完成,咱们一步步来修复:

一、代理中间件写法错误(核心问题)

你当前的apiProxy函数只是创建了代理中间件,但没有把请求传递给它,也没调用next(),导致请求直接挂起了。

错误代码:

const apiProxy = (req, res) => {
    createProxyMiddleware(options);
}
app.use('/checkCustomer', apiProxy);

修复后:
直接把createProxyMiddleware返回的中间件传给app.use就行,不需要额外包一层函数:

const apiProxy = createProxyMiddleware(options);
app.use('/checkCustomer', apiProxy);

// 或者更简洁的写法:
// app.use('/checkCustomer', createProxyMiddleware(options));

二、CORS配置混乱,导致潜在冲突

你同时用了cors包、自定义的res.header中间件,还注释了一个cors(),这些配置会互相干扰。而且既然用了代理,前端请求的是本地Express服务器,只需要允许本地的跨域请求即可,不用针对API域名配置CORS。

清理后的CORS配置:
删掉那些重复的CORS相关代码,只保留这一行(或者更严格的配置):

const cors = require('cors');
// 允许所有本地请求的跨域(因为前端是访问localhost:3000)
app.use(cors());

// 如果想更严格,指定允许的origin(你的服务器是HTTPS的):
// app.use(cors({
//   origin: 'https://localhost:3000',
//   methods: ['GET'],
// }));

同时删掉后面这段自定义的header中间件,cors包已经帮你处理好了:

// 删掉这段!
app.use(function (req, res) {
  res.header('Access-Control-Allow-Origin', '*')
  res.header('Access-Control-Allow-Headers', 'X-Requested-With')
});

三、静态文件路由重复冗余

app.use(express.static('dist'))已经会自动处理dist目录下的所有静态文件(包括index.html、assets/main.css等),后面那两个手动配置的路由完全多余,而且路径拼接还少了斜杠(__dirname + 'dist/index.html'应该是__dirname + '/dist/index.html'),直接删掉即可:

// 删掉这两段!
// app.use('/dist', (req, res) => {
//     res.sendFile(__dirname + 'dist/index.html');
// });
// app.use('/dist/assets/main.css', (req, res) => {
//     res.sendFile(__dirname + 'dist/assets/main.css');
// });

四、Fetch请求添加状态检查(方便排查错误)

当前的fetch代码没有检查响应的HTTP状态,如果API返回4xx/5xx错误,result.json()可能会静默失败,建议加上状态判断:

async checkID() {
  const options = {
    method: 'GET',
    headers: {
      Accept: 'application/json',
      'x-api-key': 'ThisIsMyAPIKeyThereIsNoOtherLikeIt'
    }
  }
  const url = `/checkCustomer?customerNumber=${this.customerID}`;
  try {
    const result = await fetch(url, options);
    // 新增:检查HTTP响应状态
    if (!result.ok) {
      throw new Error(`请求失败,状态码:${result.status}`);
    }
    const json = await result.json();
    console.log(json);
  } catch (error) {
    console.error('请求出错:', error);
  }
},

最后再检查代理配置的pathRewrite

确认你的API实际接收的路径是否符合pathRewrite的规则:你现在配置的是把/checkCustomer替换为空,也就是请求/checkCustomer?xxx会被转发到https://myAPI.com?xxx。如果你的API实际需要的是https://myAPI.com/checkCustomer?xxx,那要把pathRewrite改成:

pathRewrite: {
    '^/checkCustomer' : '/checkCustomer'
},

按照上面的步骤修改后,重启服务器再测试,应该就能正常完成请求了!

备注:内容来源于stack exchange,提问作者Takuhii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 12:03:08