Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9042

Nowでプロキシを建ててCORSエラーを爆速解決

$
0
0

前置き

nuxt generateで作った静的サイトをGitHub Pagesにホスティングし,自分のはてなブックマークのRSSをAxiosでGETして表示させようとしていました.

何も考えずにブラウザで開くとこんなエラーが出てうまくいきません.

Access to XMLHttpRequest at 'http://api.example.com' from origin 'http://localhost.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

いわゆる,オリジン間リソース共有(CORS)における同一オリジンポリシー違反です.このエラーはブラウザにおいて,現在アクセスしてるサイトと異なるオリジンにあるリソースに対してリクエストを行うときに起きます.

今回の場合,CORS解決に必要なヘッダー情報がはてな側からのレスポンスに含まれていないことが原因で,ブラウザによって通信をブロックされてしまいました.CORS解決に必要なヘッダーというのはAccess-Control-Allow-Origin: *のようなフィールドです.

参考: https://qiita.com/umechiki/items/82dd43cd1465de5f5afe

ちなみに,Nuxtでよく紹介されている@nuxtjs/proxyを使った回避方法はフロントエンド側だけで解決できますが,こいつはnuxt generateでは機能しません.まさに,こちらの方と同じ状況になりました.

以上のことから,代理でRSSを取得するプロキシを建てて,適切なヘッダを付与してレスポンスを返してくれるようにすれば,CORSを解決することができます.
この記事では,Zeit社のNowを使ってCORSエラーを簡単に解決できたのでメモします.

Now

NowはZeit社のPaaSで,シンプルを極めたようなデプロイ方法が特徴です.
Zeitのアカウントを作り,デプロイ対象のディレクトリで

$ npm i -g now
$ now login
$ now deploy

と実行していけば,ほぼ3ステップでデプロイできてしまいます.

Serverless Functionsを使うにはapiというディレクトリを作り,その中にtarget.jsを置いておくとデプロイ時に自動的にビルドされ,https://<project-name>.<username>.now.sh/api/targetでアクセスできるようになります.

参考: https://zeit.co/docs/v2/serverless-functions/introduction

代わりにRSSを取って来てもらう

api下に置くコードは,AxiosでGETしたはてなブックマークのレスポンスBodyにCORS解決に必要なヘッダを付与してリクエスト元に返すようにすればOKです.

api/target.js
constaxios=require('axios')module.exports=async(req,res)=>{awaitaxios.get('https://b.hatena.ne.jp/<username>/bookmark.rss?of=1').then((hatenaRes)=>{res.setHeader('content-type',hatenaRes.headers['content-type'])res.setHeader('Access-Control-Allow-Origin','https://<username>.github.io')res.status(200).send(hatenaRes.data)}).catch((e)=>{console.log(e)res.status(500).send('Internal Server Error.')})}

全て許す場合はres.setHeader('Access-Control-Allow-Origin', '*')を設定してください.

これははてなのRSSを取るための小さな構成例ですが,req.headersres.setHeader()を使うことでより細かな制御を行うことができます.Access-Control-Allow-Originの設定だけでは解決できない場合もあるので,いろいろ実験してみてください.


Viewing all articles
Browse latest Browse all 9042

Trending Articles