代码之家  ›  专栏  ›  技术社区  ›  user2405589

即使在服务器和客户端上设置了头,在请求的资源上也存在错误“no”access control allow origin“头”。

  •  0
  • user2405589  · 技术社区  · 6 年前

    我在端口8002上运行了一个nodejs/express后端API服务器,在端口3000上运行了一个reactjs前端应用程序。

    我正在提交来自ReactJS前端应用程序的表单以发布到API服务器上,该服务器将其保存到数据库中。

    我调用了一个函数save并继续提交表单。

    下面是这样做的代码片段:

    class Confirmation extends Component{
    saveAndContinue = (e) => {
        e.preventDefault();
    
        console.log("props : " + JSON.stringify(this.props.values));
        var form_id = Math.floor(Math.random() * 1000000); 
        let headers = new Headers();
    
          headers.append('Content-Type', 'application/json');
          headers.append('Accept', 'application/json');
    
          headers.append('Access-Control-Allow-Origin', '*');
    
        fetch("http://localhost:8002/sharepoint/big_data_poc/" + form_id,{
            method:'POST',
            //mode: 'cors',
            body:JSON.stringify(this.props.values),
            headers: headers
        }).then(res => res.json()).then(this.setState({confirmation_id:form_id}))
        .then(response => console.log('Success:', JSON.stringify(response)))
        .catch(error => console.error('Error:', error));
        this.props.nextStep();
    }
    

    我还向nodejs服务器响应头添加了访问控制allow origin

    cb_service.prototype.addForm = function(req,res,form_id, doc_type,payload){
    logger.info(JSON.stringify(payload));
    bucket.upsert(form_id,payload,function(err,result){
        if(err){
            logger.error("error inserting data in couchbase")
        }
        else {
            res.setHeader('Access-Control-Allow-Origin','*')
            res.setHeader('Access-Control-Allow-Methods','POST, GET, OPTIONS, PUT')
            res.setHeader('mode','cors')
            logger.info("successful inserts");
            res.status(200);
    
            return res.json({"success":"ok"});       
        }
     })
    }
    

    我根本看不到任何请求进入服务器。我只是在浏览器控制台中看到以下错误:

    加载失败 http://localhost:8002/sharepoint/big_data_poc/944960 :对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许来源”头。起源 http://localhost:3000 因此不允许访问。如果不透明的响应满足您的需求,请将请求的模式设置为“无CORS”,以获取禁用CORS的资源。

    最感谢您的帮助!!我想我已经做了所有类似问题推荐的事情了。即使是Safari也会抛出以下错误:

    [错误]加载资源失败:源 网址:http://localhost:3000 不允许访问控制允许来源。(408661,0行)

    [错误]无法加载Fetch API http://localhost:8002/sharepoint/big_data_poc/408661 . 起源 网址:http://localhost:3000 不允许访问控制允许来源。

    非常感谢!

    2 回复  |  直到 6 年前
        1
  •  1
  •   shutsman    6 年前

    安装 cors 你不会有任何问题的 const cors = require('cors'); app.use(cors()); NPM链接 https://www.npmjs.com/package/cors

        2
  •  0
  •   Bilel Kabtni    6 年前

    尝试将这些中间件添加到应用程序中

    app.use(function (req, res, next) {
    
    // Website you wish to allow to connect
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8888');
    
    // Request methods you wish to allow
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    
    // Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
    
    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', true);
    
    // Pass to next layer of middleware
    next();
    

    (});