Sails.jsでも使ってるのであれば話は別ですが、
そもそもMVCというのはフレームワーク次第というか、
文脈でコロコロ責務が変わりがちなのでお手製のものでMVCですと言うと違和感ありますね。
また、ざっとコードを見ましたが、
かなり練られてない初期のコードの印象があります。
これを果たしてコントローラやモデルと呼んでもよいものかかなり悩ましい所があります。
tag: MySQL
どこにMySQLがあるねん
JavaScript
1// メンバー一覧
2exports.listMember = () =>{
3console.log("よばれちゃった");
インデントは整えましょう。
他の箇所もぐちゃぐちゃですので、もっとマシなエディタを使うなりして対策しましょう。
コードを読む他の回答者さんへの強いストレスにもなりますし、質問者さん本人の品性も疑われます。
ちゃんとmodelには繋げれています。
何をもって繋げれたのですか?
あと、「ら」は文章では抜かないようにしてください。
大前提としてJavaScriptをゴリゴリ書いて自分なりのMVCを実現するにはかなりスキルが足りていないように見受けられるので、Sails.js等の出来合いのフレームワークを使ってください。
それでも自分で書きたいなら、まずはJavaScriptの非同期の書き方を学んでください。
次にPromiseやasync/awaitを覚えるまで継続して勉強しましょう。
ここで質問を連発しても貴方のスキルは上達しません。
また、MVCなのになんでクラスを利用していないのですか?
JSは元々プロトタイプベースのオブジェクト指向なのでそれでオブジェクト指向を描き切れる人なら話は別ですが…
ともかく、そういう訳でES2015のクラス構文を覚えて扱えるようになってください。
ただし、非同期の考え方だけは共有しておくべきだと判断しました。
最初の取っ掛かりとして活用してください。
まず、JavaScriptはシングルスレッドで動作します。
シングルスレッドというのは一切「待てない」ので、ファイルやDBへの読み書きは命令に比べると遥かに重い処理なのでそれらを待っている間、他の処理が全て止まってしまいます。
そこで、JavaScriptはイベントループという概念を採用しました。
JavaScriptでは関数をToDoリストややるべきことの書き置きみたいなノリで沢山宣言します。
これら沢山作った関数を、「Aの処理が終わったら、この関数を実行してね」という風に書き置き的な受け渡しをします。
その為、JavaScriptの関数は「変数への保存」「引数への設定」「戻り値への設定」などなど、変数に代入した数値や文字列と殆ど同じ事ができます
これを第一級オブジェクトと呼びますが、関数を書き置きとしてあちこちへ運ぶ手段として利用しています。
関数が入っているものに対しては()
をお尻につければ誰でも実行出来ます。
変数、引数、戻り値は全て()
をつければ実行されますし、
(function(){})()
のようにカッコに包みながら宣言して即実行する即時実行関数というものもあります。
また書き置き化して他人に手渡した関数は、もう戻り値を回収することは不可能になります。
書き置き化した関数の引数で受け取るという形になりますからね。
それを踏まえて質問文にあったModelを改良してみましょう。
JavaScript
1db.serialize(() => {
2 var query = `select * from member`;
3 db.all(query, (err, rows) => {
4 if (!err) return;
5 return {
6 title: 'メンバ一覧',
7 member: rows,
8 };
9 });
10});
これは第一引数が無名関数ですね。
このように名前を付けるまでもないような使い捨ての処理は、大抵このような形で無名関数をその場で作って引数に設定してあげると名付けの手間が省かれて楽ですね。
同じようにdb.all(query, fn)
と、ここでも第二引数に無形関数を用意していることがわかります。
問題はこのreturn {}
で、書き置き(コールバック関数)はこの時点でreturnしても受け取り先がいませんのでこのddata
を取り出す事は不可能となります。
じゃあどうするか?
Controller側で書き置きを用意して、Modelへ注入する事で取り出すという作戦を実施する必要があります。
Controller
JavaScript
1router.get('/', (req, res, nxet) => {
2 user.listMember((err, data) =>
3 res.render('admin', data)
4 );
5});
Model
JavaScript
1exports.listMember = (cb) => {
2 console.log("よばれちゃった");
3 db.serialize(() => {
4 db.all(`select * from member`, (err, rows) => {
5 if (err) cb(err, null); return;
6 cb(err, {
7 title: 'メンバ一覧',
8 member: rows,
9 });
10 });
11 });
12};
このようにexports.listMember
には書き置き関数を受け付けるcb
を引数として用意しておき、
db.all
メソッドが終わるまでcbは仮引数のまま持ち回し、dataを作ってから尻に()
を付けて叩きます。
こんな風に今回は手直ししようと思えば手直しは可能です。
ですが所詮対処療法ですし、この調子で質問しまくっていてはシステムを完成させる為に数百回の質問は確実でしょうから、Sails.jsあたりへ移行するか(ただし、これもマイナーなフレームワークなのでガチ英語のドキュメントくらいしか頼れるものがなさそうですが)、おとなしくクラウドソーシング等で金を払う事をオススメします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。