web初心者が、気分転換トリビアボタンを作ってみた（Vue.js + Trivia API）

#概要
　普段は組込みソフトエンジニアをしており、設計やデバッグが思うように進まず、集中が続かなかったり脳をリフレッシュしたいことが多々あります。

そこで、脳をリフレッシュするためにブラウザさえ使えれば気分転換できる
「**トリビアボタン**」
を作ってみました。

##デモ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">「気分転換トリビアボタン」を公開しました！<br>頭が疲れた時や、電車移動中の隙間時間に見ると気分転換になるかなと思い作りました！<br><br>私はフロントエンドのド素人なので、HTMLがお粗末なのは目瞑っていただけると嬉しいです。<br><br>こちらから遊ぶことができます☺<a href="https://t.co/bvl25aDtu9">https://t.co/bvl25aDtu9</a><a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://t.co/nCeC9ChetO">pic.twitter.com/nCeC9ChetO</a></p>&mdash; まえぷー@出窓菜園ティスト (@kmaepu) <a href="https://twitter.com/kmaepu/status/1263098687204364288?ref_src=twsrc%5Etfw">May 20, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[こちら](http://refreshingtrivia.gq/)から利用できますのでお試しあれ～👍

※2020/5/20現在、エスケープ文字がおかしな表示になっている不具合があります。

#中身はどうなっているか

##構成
　ざっくりとですが、次のような構成になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/861671cb-8663-0a12-f000-13ec4d9bd6a9.png)

トリビアのデータは「OPEN TRIVIA DATABASE」のTrivia APIで取得て利用しています。

お気づきの方もいらっしゃるかもしれないですが、ドメインがherokuではないです。これは、「**[freenom](https://www.freenom.com/ja/index.html?lang=ja)**」という無料でドメイン取得ができるサービスを利用しています。

##開発環境
　2020/5/20現在の開発環境です。
- Windows10
- VS code 1.45.0
- Node.js v10.15.3

##ソースコード解説

```html:inde.html
<html>
<head>
  <title>Refreshing trivia</title>
</head>
<body>
  <p>Refreshing trivia</p>
  <div id="app">
    Question：<br>
    <br>
    　　{{ message }}<br>
    <br>
    Answer：<br>
    　{{ ans }}<br>
    <br>
    <button v-on:click="getData();">次のトリビア</button>
    <br>
    ※ネット環境によりロードに数秒かかる事があります。
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        message: '',
        ans: ''
      },
      methods: {
        getData: async function () {
          const response = await axios.get('/api')
          console.log(response.data);
          this.message = response.data.results[0].question;
          this.ans = response.data.results[0].correct_answer;
        },
      },
      mounted: function () {
        this.getData();
      }
    })
  </script>
</body>
</html>
```

　index.htmlでは、Vue.jsでボタンを押したときの処理を実装しています。こうすることでシングルページアプリケーション（SPA）を実現しています。


```javascript:app.js
// expressライブラリを呼び出す
var express = require('express');
var app = express();

// axiosライブラリを呼び出す
const axios = require('axios');

// public というフォルダに入れられた静的ファイル（HTMLファイル・CSSファイル・ブラウザ上のJavaScriptファイル）はそのまま表示
app.use(express.static(__dirname + '/public'));

app.get('/api', async function(req, res) {
  let response;
  try {
    // Trivia APIにリクエストして、データを取得する
    response = await axios.get('https://opentdb.com/api.php?amount=1');
    console.log(response.data);
  } catch (error) {
    console.error(error);
  }
  // 結果をJSONに割り当てる
  res.json(response.data);
});

//app.listen(8080);
app.listen(process.env.PORT || 8080);
```

　app.jsではTrivia APIにリクエストを出してデータを取得し、index.htmlに渡しています。

#問題発覚！
ここで、Trivia APIの癖が発覚しました。Trivia APIから取得したデータをそのまま利用すると、次のようにエスケープ文字が変換されてしまっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/45ac631b-c490-f277-d5d4-21eda19f8d7a.png)

[こちら](http://shanabrian.com/web/javascript/unescape-html.php)の方法でアンエスケープしてやれば修正できるのではないかとトライしています...。

#おわりに
　トリビアは英語限定なので、翻訳機能があると嬉しいですね。これでも英語の勉強になる...？からよしとします。

#参考
[Trivia API](https://opentdb.com/api_config.php)
[freenom](https://www.freenom.com/ja/index.html?lang=ja)
[エスケープ文字をアンエスケープする方法](http://shanabrian.com/web/javascript/unescape-html.php)