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

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

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

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Node.js

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

JavaScript

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

Q&A

解決済

1回答

470閲覧

Node.js MVCのデータの受け渡しについて

Abenosan

総合スコア25

MySQL

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Node.js

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

JavaScript

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

0グッド

0クリップ

投稿2018/09/03 06:38

編集2018/09/03 07:11

現在メンバー管理システムを作成しております。

-問題発生
コントロールからモデルへの繋ぎはできいるのですが、モデルからコントロールへデータを受け渡せないという問題に直面しております。

-したいこと
コントロールからモデルが処理したデータをもらえるようにしたいです。

controller

var express = require('express'); var router = express.Router(); var user = require('../model/user'); // データベースオブジェクト取得 router.get('/',function(req,res,nxet){ var data = user.listMember();   ここで呼び出しています res.render('admin', data); }); module.exports = router;

model

var sqlite3 = require('sqlite3'); var db = new sqlite3.Database('ChieproDB.sqlite3'); // メンバー一覧 exports.listMember = () =>{ console.log("よばれちゃった"); db.serialize(()=>{ var query = `select * from member`; db.all(query,(err,rows)=>{ if(!err){ return data = { title: 'メンバ一覧', member: rows, } } }); }); }

ちゃんとmodelには繋げれています。

express-session deprecated undefined saveUninitialized option; provide saveUninitialized option app.js:26:9 undefined POST / 302 22.685 ms - 54 よばれちゃった     // console.logで表示 GET /admin 500 12.563 ms - 2069

**
理想image図**
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

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あたりへ移行するか(ただし、これもマイナーなフレームワークなのでガチ英語のドキュメントくらいしか頼れるものがなさそうですが)、おとなしくクラウドソーシング等で金を払う事をオススメします。

投稿2018/09/03 07:58

miyabi-sun

総合スコア21158

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問