質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Angular

Angularは、JavaScriptフレームワークです。AngularJSの後継であり、TypeScriptベースで実装されています。機能ごとに実装を分けやすく、コードの見通しが良いコンポーネント指向です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

1541閲覧

Angular + ExpressでイベントドリブンでMySQLと通信方法

t_tak

総合スコア6

Angular

Angularは、JavaScriptフレームワークです。AngularJSの後継であり、TypeScriptベースで実装されています。機能ごとに実装を分けやすく、コードの見通しが良いコンポーネント指向です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2020/06/22 06:54

前提・実現したいこと

Angularの練習として、フォームにあるボタンを押すと打刻できるアプリを作成しております。
もともと、JS + ExpressでMySQLのテーブルから情報を取得するものを作成していたので、通信部分はそれを流用しようと考えております。

MySQLのユーザー情報がいれてあるテーブルから名前を取得しフォームのセレクトボックスに反映。名前を選択しボタンを押すと、MySQL側の別テーブルに選択した名前とボタン押下時の時刻をインサートしたいと思っております。

発生している問題・エラーメッセージ

色々と調べてはいるのですがHTTPClientModuleを用いてどのようにMySQL側から取得した情報をもとに、クリックイベントを動かせばよいのか分からず詰まっております。
どのように記述したらよいのか分からず教えて頂けたら幸いです。

該当のソースコード

######フォーム

HTML

1<form class="form"> 2 <div> 3 <label class="form-name">名前</label> 4 <select id="select_name" name="input_name" class="form-selectbox"> 5 <option value="test">TEST</option> 6 </select> 7 <label><span class="form-id">ID</span><input id="select_id" name="input_id" class="form-label"></label> 8 <label><span class="form-mail">メールアドレス</span><input id="select_mail" name="input_mail" class="form-label"></label> 9 </div> 10 <div class="form-button"> 11 <button class="btn" id="begin" name="begin_button" type="submit" value="current_time" (click)="begin_click()">打刻</button> 12 </div> 13</form>

ts

1import { Component, OnInit } from '@angular/core'; 2 3@Component({ 4 selector: 'app-form', 5 templateUrl: './form.component.html', 6 styleUrls: ['./form.component.css'] 7}) 8export class FormComponent implements OnInit { 9 10 begin_click() :void { 11 console.log('test'); 12 } 13 14 constructor() { } 15 16 ngOnInit(): void { 17 } 18 19}

######Express

javascript

1const express = require("express"); 2const app = express(); 3const bodyParser = require("body-parser"); 4const dateutils = require("date-utils"); 5const util = require("util"); 6 7app.use(express.static("css")); 8app.use(bodyParser.urlencoded({ extended: true })); 9app.use(bodyParser.json()); 10 11/* 12 * usersは、ユーザー情報テーブル 13 * dakokuは、打刻情報テーブル 14 */ 15app.get("/", async (req, res) => { 16 let users_sql = "select * from users"; 17 let dakoku_sql = "select * from dakoku"; 18 let data_users = await queryAsync(users_sql); 19 let data_dakoku = await queryAsync(dakoku_sql); 20 res.json(data_dakoku, data_users); 21}); 22 23app.post("/", async (req, res) => { 24 var dt = new Date; 25 var now = dt.toFormat("HH24:MI:SS"); 26 var today = dt.toFormat("YYYY年MM月DD日"); 27 28 console.log("request", req.body.input_name); 29 30 const resid = await queryAsync("select max(id) from dakoku"); 31 const preid = resid[0]["max(id)"]; 32 const id = preid + 1; 33 34 35 /*打刻日を取得*/ 36 let sql_lastdate = "select max(date) from attendance where name = ? "; 37 var lastdate = await queryAsync(sql_lastdate, req.body.input_name); 38 lastdate = lastdate[0]["max(date)"]; 39 40 41 /*ボタンクリック*/ 42 if(req.body.begin_button){ 43 let sql = "INSERT INTO attendance SET ?"; 44 45 var results = await queryAsync(sql, { id: id, name: req.body.input_name, mail: req.body.input_mail, date: today, pushtime: now}); 46 console.log("打刻"); 47 48 res.json("/"); 49 }; 50 51 52/*MySQL*/ 53app.listen(3000); 54 55const mysql = require("mysql"); 56 57const con = mysql.createConnection({ 58 host: "localhost", 59 user: 'root', 60 password: "pass", 61 database: "test_db", 62}); 63const queryAsync = util.promisify(con.query).bind(con); 64 65con.connect(function (err) { 66 if (err) throw err; 67 console.log("Connected"); 68});

MySQL

1テーブル名:dakoku 2+----+-----------+--------------------+----------+----------+ 3| id | name | email | date | pushtime | 4+----+-----------+--------------------+----------+----------+ 5 6テーブル名:users 7+----+-----------+--------------------+ 8| id | name | email | 9+----+-----------+--------------------+ 10| 1 | user1 | user1@test.com | 11+----+-----------+--------------------+ 12| 2 | user2 | user2@test.com | 13+----+-----------+--------------------+ 14| 3 | user3 | user3@test.com | 15+----+-----------+--------------------+ 16

補足情報(FW/ツールのバージョンなど)

angular cli v9.1.8
rxjs 6.5.5
typescript 3.8.3
webpack 4.42.0
MySQL v5.7.30
Node v12.16.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

JS + ExpressでMySQLのテーブルから情報を取得するものを作成していた

ここをもう少し掘り下げましょうか。
私が「実際にはこんな風にやってたんじゃないか?」と考えている内容です。

Node.jsのExpress.jsを使って
アクセスが来たらMySQLから値を取り出して、
そのMySQLから取り出した値を使って動的なHTMLを生成して返していた。

もしそうなら、次に必要になるのはAjaxです。


Angularはあまり詳しくありませんが、
Reactのライバルとも言えるJSフレームワークの一つで、思想は大体同じです。

  1. HTMLのテンプレートをJSフレームワークに読ませる
  2. JSフレームワークはテンプレートに従ってDOMを吐く
  3. JSフレームワーク推奨の手順に従って変数を書き換える
  4. 変数を書き換えた事を検知して、JSフレームワークが最新のDOMを出し直す

質問文のコードが動作するのであれば、
既に2までは完成しているはずです。

次は3ですが、下記の2つをクリアする必要があります。

  • どうやってJavaScriptでExpressにアクセスしてDB値を取り出すのか
  • どうやって3の手順で変数を書き換えるのか

Angular 2とちょっと古いですが、こんな感じでやるんだよと書かれている記事を見つけました。
参考記事: Angular2でAjaxを使ってデータを取得する(Httpクライアント)

これをとっかかりに「Angular Ajax」等で検索しながら頑張ってみてください。

投稿2020/06/22 07:24

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_tak

2020/06/29 07:51

ご回答ありがとうございます。 教わった通り通信するためにHTTPClientModuleを用いることで、なんとかDBから情報を取得することができました。 色々試していたので遅くなってしまいましたが、助かりました。ありがとうございます!
miyabi-sun

2020/06/29 08:09 編集

お見事! DBのテーブルなんかもきっちり出していたので 方向性に関しての抽象的なアドバイスを出すだけで行けるだろうと思いましたが流石ですね。 もし余力があるなら下記にも挑戦してみてください。 - MySQLのidは基本的にオートインクリメントがおすすめ  https://www.dbonline.jp/mysql/table/index7.html - RESTfulなURIに関しての知識  →パスが`/`のURLがユーザ情報と打刻時刻を大量に返すのはいかがなもんか、RESTfulとしては微妙  →RESTfulで調べて学習してみてください、格段に他人に説明しやすい水準で品質が安定します - バリデートはミドルウェアでやっても良いかもね  →Express.jsのミドルウェアは`app.use(fn)`です。  →POSTのパスXに限ってこのミドルウェアを実行するみたいな事ができ、インターセプトして400番エラーを返すなんて事も可能。  →じゃあミドルウェアってなんだ?Express.jsに於けるミドルウェアの作り方とは?  →プログラマとしてのレベルが格段に上がる
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問