uni-app 函数url化 option请求自动返回不带`Access-Control-Allow-Origin`导致跨域报错
uni-app 函数url化 option请求自动返回不带Access-Control-Allow-Origin
导致跨域报错
产品分类:uniCloud/App
操作步骤:
- option 请求
https://de33740e-72aa-47fe-a83e-c2584f7c6f22.bspapp.com/autoBackend/auto/login
- response.headers 没有
Access-Control-Allow-Origin
, 且无法自定义
预期结果:
- option 请求
https://de33740e-72aa-47fe-a83e-c2584f7c6f22.bspapp.com/autoBackend/auto/login
- response.headers 自动返回请求域名或可以自定义
实际结果:
- option 请求
https://de33740e-72aa-47fe-a83e-c2584f7c6f22.bspapp.com/autoBackend/auto/login
- response.headers 没有
Access-Control-Allow-Origin
, 且无法自定义
bug描述:
- option 请求 url 链接,返回 header 没有
Access-Control-Allow-Origin
导致跨域报错
此请求头不可修改,请自行在uniCloud web控制台的跨域配置里面配置上对应的域名
在使用 uni-app 进行开发时,如果你遇到跨域问题,特别是 OPTIONS
请求自动返回时没有 Access-Control-Allow-Origin
头,导致跨域报错,可以尝试以下几种解决方案:
1. 后端配置 CORS
跨域问题通常需要后端服务器进行配置。确保后端服务器在响应 OPTIONS
请求时,正确设置了 Access-Control-Allow-Origin
头。以下是一个简单的 Node.js Express 示例:
const express = require('express');
const app = express();
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
if (req.method === 'OPTIONS') {
return res.sendStatus(204);
}
next();
});
app.get('/api/data', (req, res) => {
res.json({ message: 'Hello, world!' });
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
2. 使用代理服务器
如果你无法修改后端服务器的配置,可以在 uni-app 中使用代理服务器来解决跨域问题。在 vue.config.js
中配置代理:
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://your-backend-server.com',
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
}
}
}
};
然后在你的请求中使用 /api
前缀:
uni.request({
url: '/api/data',
success: (res) => {
console.log(res.data);
}
});
3. 使用 JSONP
如果后端支持 JSONP,你可以使用 JSONP 来绕过跨域限制。uni-app 提供了 uni.request
方法,可以通过 dataType: 'jsonp'
来发起 JSONP 请求:
uni.request({
url: 'http://your-backend-server.com/api/data',
dataType: 'jsonp',
success: (res) => {
console.log(res.data);
}
});
4. 使用云函数
如果你使用的是云开发(如腾讯云、阿里云等),可以通过云函数来代理请求。云函数通常没有跨域限制,你可以在云函数中发起请求,然后将结果返回给前端。
5. 使用 uni.request
的 header
配置
如果你需要自定义请求头,可以在 uni.request
中配置 header
:
uni.request({
url: 'http://your-backend-server.com/api/data',
header: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-token'
},
success: (res) => {
console.log(res.data);
}
});
6. 使用 uni.addInterceptor
全局拦截器
你可以使用 uni.addInterceptor
来全局拦截请求和响应,添加必要的头信息:
uni.addInterceptor('request', {
invoke(args) {
args.header = args.header || {};
args.header['Authorization'] = 'Bearer your-token';
},
success(res) {
console.log('Request success:', res);
},
fail(err) {
console.log('Request fail:', err);
}
});