はじめに
Node.jsドドド初心者です。ローカルで動くDBの情報を表示する簡単なアプリを作成しようと思い立って作ったのですが、思わぬところで落とし穴があったので、それについての覚え書きです。
Node.js Expressで、mysqlを操作している際に発生した事象です。
DATE型がDATETIME型として取得されてしまう
今回表示するテーブルは非常にシンプルな情報で構成されていました。
table名 : youtube
+----+------------+-----------------------------------------------------------------+
| id | date | title |
+----+------------+-----------------------------------------------------------------+
| 1 | 2020-08-08 | 【絶対解けない】答えが「見たことない字」になる合体漢字クイズ |
| 2 | 2020-08-07 | 数学の図形を使った共通点当てゲームで爆笑連発!【VENN'S CODE】 |
| 3 | 2020-03-27 | 伊沢vs伊沢vs伊沢vs伊沢 |
+----+------------+-----------------------------------------------------------------+
(中身は、すきなYoutuberさんの動画の情報を拝借しました。)
しかし、実際に情報をNode.jsで表示すると、DATE型のdateカラムが勝手にDATETIME型になってしまう問題が発生しました。
コードは以下の通りです。
app.js
/*(中略)*/app.get("/youtube_list",(req,res)=>{connection.query('SELECT * FROM youtube',(error,results)=>{res.render("youtube_list.ejs",{items:results});)};});
youtube_list.ejs
<%items.forEach((item) => {%><li><divclass="item-data"><spanclass="id-column"><%=item.id%></span><spanclass="first-column"><%=item.date%></span><spanclass="second-column"><%=item.title%></span></div></li><%});%>
調べた際に、同様の事象が発生している方が何人かいました。JSONの仕様では?という話もあったので、おそらくその影響でしょうか。
シンプルな解決策:connection option
最初は、関数を作ってDATETIME型の情報をこねくり回す方法を取ったのですが、その後改めて調べてみたら、とても単純な話で、「connectionの際にoptionを付与するだけ」でした。
app.js
constconnection=mysql.createConnection({host:'localhost',user:'root',password:'password',database:'quizknock',dateStrings:'date'/*または'true'*/});connection.connect();
このdateStringsで、mysqlから取得するデータを文字列として取得することができます。
知ってしまえばめちゃくちゃ簡単ですね・・・
参考:mysql Git