2017-05-29 4 views
1

Mongoデータベースでユーザーを探すためにExpressサーバーにAxiosリクエストを行うReactアプリケーションがあります。以前は、Railsのバックエンドを構築しCORSの宝石を手に入れましたが、Express側でCORSを設定しようとしたが、解決策を見つけることができませんでした。ヘッダー(つまりユーザー名)のカスタムフィールドを渡して、そのフィールドを使用して自分のデータベースに対してクエリを実行できるようにしたいと考えています。リクエストヘッダーフィールド<field-name>は、プリフライト応答のAccess-Control-Allow-Headersで許可されていません

私は、ブラウザで取得

エラー:

XMLHttpRequest cannot load http://localhost:3000/api/users/test. 
Request header field username is not allowed by Access-Control-Allow-Headers 
in preflight response. 

マイExpressサーバをセットアップし、次のCORSを持っており、私のaxiosコードはparamはヘッダオブジェクトに渡されると、サーバーへのリクエストを作るしようとしている反応するが、まだ応答エラーでプリフライトを取得しています。

app.use(function(req, res, next) { 
    res.setHeader('Access-Control-Allow-Origin', '*'); 
    res.setHeader('Access-Control-Allow-Credentials', 'true'); 
    res.setHeader('Access-Control-Allow-Methods', 'GET,HEAD,OPTIONS,POST,PUT,DELETE'); 
    res.setHeader("Access-Control-Allow-Headers", 
    "Access-Control-Allow-Headers, 
    Origin, 
    Accept, 
    X-Requested-With, 
    Content-Type, 
    Access-Control-Request-Method, 
    Access-Control-Request-Headers, 
    Authorization") 
    res.setHeader('Cache-Control', 'no-cache'); 
    next(); 
}); 

export const loadAccount = (username) => { 
    return(dispatch) => { 
    axios 
    .get(`${url}/users/test`, { 
     headers: {username: username} 
    }) 
    .then(resp => { 
     dispatch({ 
     type: 'LOAD_ACCOUNT', 
     account: resp.data 
     }) 
    }) 
    .catch(errors => { 
     console.log(errors) 
    }) 
    } 
} 
+0

編集するhttps://stackoverflow.com/posts/44250594/editを使用してください/あなたの質問を更新して、あなたのブラウザのdevtoolsコンソールに表示されている正確なエラーメッセージに貼り付けてください。 – sideshowbarker

答えて

1

あなたは、あなたのAccess-Control-Allow-Headers句で有効なヘッダーとして、すなわちusernameを追加する必要がありますように私には思える:

res.setHeader("Access-Control-Allow-Headers", 
    "Access-Control-Allow-Headers, 
    Origin, 
    Accept, 
    X-Requested-With, 
    Content-Type, 
    Access-Control-Request-Method, 
    Access-Control-Request-Headers, 
    Authorization, 
    username") 
res.setHeader('Cache-Control', 'no-cache'); 
next(); 
+0

これはトリックでした!私のプロジェクトが十分に大きくなり、多くのカスタムヘッダーをHeaders節に渡す必要がある状況で、その節が潜在的に大きくなる可能性があるということで、私は不思議に思います。回避策がありますか、またはすべてのカスタムヘッダーをキャッチする句で宣言できるキャッチオールですか? – jamesvphan

+0

あなたは単に '*'を使うことができるはずです。あるいは、ヘッダを完全に削除する必要があります。デフォルトは何でも許可しますが、私は100%確実ではないと思います。 – ruedamanuel

関連する問題