💡

NuxtとGASでのCORSエラーに悩んだこと

2022/01/28に公開

きっかけ

Nuxt側からGASを動かして、GoogleFormを作成して、作成したGoogleFormのURLを返却したいことから始まりました。

結論

nuxt.config.js
axios: {
    baseURL: '/',
    proxy: true,
  },
  proxy: {
    '/api': {
      target:
        'GASのエンドポイント',
      pathRewrite: { '^/api': '' },
      followRedirects: true,
      // ↑これを追加したらいけました
    },
  },

以下は、過程などなので、見たい人だけ見てください!

過程

最初はこんなふうに怒られました。
このときはただのCORSエラーか
Proxyを設定しないといかんな程度で

nuxt.config.js
axios:{
  ///略///
  proxy: true
}

これでいけるわーーみたいに考えていたのですが、
またこの画面
。。。
あれ?俺POSTなのにGET?きちんと

index.vue
data() {
   return {
     title: "",
     googleFormUrl: ""
   }
 },
methods: {
    async gasApi() {
      await this.$axios.$post('/api',{
        // titleはGoogleFormのタイトルにする文字列を渡している
        title: this.title
      })
      .then((res)=>{
         this.googleFormUrl = res.url
      })
      .catch((error)=>{
       console.log(error)
       console.log("エラーです")
      })
    },
  },
index.gas
function doPost(e){
  const params =  JSON.parse(e.postData.contents);
  const createForm =  FormApp.create(params.text);
  const getUrl = createForm.getPublishedUrl();
  const qus =  createForm.addTextItem();
  qus.setTitle(e.title);
  //Nuxt側に返すときはJSONに戻してからpostする
  const output =  ContentService.createTextOutput();
  output.setMimeType(ContentService.MimeType.JSON);
  output.setContent(JSON.stringify({ url: getUrl }));
  return output;
}

ここで自分はつよつよなエンジニアに質問しにいきました。

そしたら,GASの仕様で弾かれてると教えてもらいました!

原因としては、
OPTIONSが飛んでくるので、そのOPTIONSをきちんと200で返して(リダイレクトしてはいけない)、
次に、リダイレクト先だけCORS指定ない場合、これは普通のCORSエラーで落ちるので、しっかりとCORS指定をしておかなければならない。

結果、今回はGASのCORSについて学びました。

Discussion