uni-app 函数url化 option请求自动返回不带`Access-Control-Allow-Origin`导致跨域报错

发布于 1周前 作者 yuanlaile 来自 Uni-App

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 导致跨域报错

2 回复

此请求头不可修改,请自行在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.requestheader 配置

如果你需要自定义请求头,可以在 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);
  }
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!