如何使用CORS运行Graphql

时间:2017-06-20 18:38:39

标签: graphql

我已经阅读了几篇关于此的文章,但它们都不适合我。

https://github.com/graphql/express-graphql/issues/14

这是我的快递代码:

app.use("/graphql", function (req, res, next) {
  res.header('Access-Control-Allow-Origin', 'http://localhost:8080');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
  if (req.method === 'OPTIONS') {
    res.sendStatus(200);
  } else {
    next();
  }
});


// apply graphql middleware
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: rootResolver,
  graphiql: true,
}))

如果我这样做,飞行前OPTIONS成功,但实际的POST请求失败。

我正在使用此函数向本地graphql服务器发出请求。

function postFn(url, payload) {
  return $.ajax({
    method: 'POST',
    url: url,
    contentType: 'application/json',
    xhrFields: {
      withCredentials: true
    },
    data: payload
  });
}

以下是触发POST请求的前端代码:

  let query = `
    query myqury($offset: Int, $limit: Int) {
      clients(limit:$limit , offset:$offset ) {
        docs{
          _id
          full_name
        }
        total
        limit
        offset
      }
    }
  `
  var variables = {
    offset: offset,
    limit: limit
  }
  let payload = {
    query: query,
    variables: variables
  }
  return request.post(graphQlEndpoint, payload)

错误消息是:

否'访问控制 - 允许 - 来源'标头出现在请求的资源上

3 个答案:

答案 0 :(得分:1)

我和你有同样的问题。在快速服务器上使用graphQL。

尝试使用快递cors

像这样在您的快速代码中使用它

const express = require( `express` );
const graphqlHTTP = require( `express-graphql` );
const cors = require( `cors` );
const app = express();

app.use( cors() );
app.use(
    `/graphql`,
    graphqlHTTP( {
        schema: schema, // point to your schema 
        rootValue: rootResolver, // point to your resolver 
        graphiql: true
    } )
);

基于GraphQL Documentation

的示例

fetch( url, {
    method : `post`,
    headers: {
        'Content-Type': `application/json`,
        'Accept'      : `application/json`
    },
    body: JSON.stringify( {
        query: `
        {
            person {
                name
            }
        }`
    } )
} )
.then( response => response.json() )
.then( response => console.log( response ) );

答案 1 :(得分:0)

使用Vue客户端拨打电话时遇到了同样的问题。我可以解决的唯一方法是在浏览器上禁用Cross-Origin限制以进行测试。

答案 2 :(得分:0)

请在server.js文件中插入以下代码

const graphQLServer = express();
const corsOptions = {
    origin(origin, callback) {
        callback(null, true);
    },
    credentials: true
};
graphQLServer.use(cors(corsOptions));
var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type,token');
    next();
}
graphQLServer.use(allowCrossDomain);

我认为这可以解决您的问题