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

