2020年7月19日日曜日

Node-RED での CORS 対応まとめ(IBM Cloud版も対応)

CORS とはブラウザに「No 'Access-Control-Allow-Origin' header」とか言われちゃうアレです。
まず普通に GET とか multipart/form-data での POST なら

msg.headers = {};
msg.headers["Access-Control-Allow-Origin"] ="*";

って function ノードに書いてレスポンスすれば OK!👍

でも、application/json を POST したいんじゃ!ってなるとプリフライトリクエストが発生して、上記だけでは「No 'Access-Control-Allow-Origin' header」って言われちゃいます。
しかも、Node-RED 上ではリクエストが来ているのかも確認できません。

この場合は POST のレスポンスに Access-Control-Allow-Origin を付与するのではなく、POST の前に発生する OPTIONS メソッドに対して Access-Control-Allow-Origin を付与させる必要があります。

でも、Node-RED の HTTP in ノードには OPTIONS はありません。
なのでエディター上ではリクエストが確認できません。

これに対応するには、Node-RED の設定ファイル(setting.js)を修正する必要があります。
ちなみに、Node-RED IBM Cloud Starter Application の場合は、bluemix-setting.js です。

そのファイル内にコメントアウトされている httpNodeCors という記述があるので、それをコメント解除します。
IBM Cloud で bluemix-setting.js の場合はそもそも記述がないので、

var settings = module.exports = {…(略)…}
の中に

httpNodeCors:{
  origin:"*",
  methods:"GET,POST,PUT,DELETE"
},

とか追記しときゃ OK です。(methods に OPTIONS は無くていい)
まぁ Continuous Delivery 利用するか CLI でなんやかんやして push とかしないとダメなんでめんどいですが。
もしかしたら Cloudant 内の settings ドキュメントの編集でも対応できるかもしれませんので、誰かチャレンジしてみてくださいw

修正したら再起動して解決ですヤッタネ☆

CORS とかプリフライトリクエストについて詳しく知りたい方はこちら。