06/12 今日の日記
■体調メモ----------------------------------------------------------------------------体調メモ(06/01~):(リンデロンVsで回復傾向鈍化)右足すねのかゆみ(23/10/01)左足の虫刺され(24/05/30:完治)/背中のひりひり(24/06/02:完治)/左太ももの蕁麻疹(24/06/04)-----------------------------------------------------------------------------------■今年のも目標----------------------------------------------------------------------★自分の中の理想からくる完璧主義を打破して、「柔軟性を持つこと」!!★必ず文字は二回確認しろ!★「現実を受け入れて」他者比較をしない。自分の輪を信じろ!・傾聴してしっかり考えてからコミュニケーションしろ!・不安は愛着障害から!しっかり問題を意識し解決して克服しよう!。・認知バイアスを高めよう!共感力を身に着けよう!・一人暮らしを始めてみよう!・生活を安定させよう!-----------------------------------------------------------------------------------■今日の肯定-----------------------------------------------------------------------・理解して次に進んだ・集中できた・成長を実感した■今日のありがとう------------------------------------------------------------------・報告をしっかりした・テスクをこなした・一日お疲れ様-----------------------------------------------------------------------------------本日は、システムの調査が終わったのでWeb関連の勉強に時間を使いました。前の5月に作成したNode.JSのお再来と勉強のし直しです。久しぶりの起動でMVC的にメインレイアウトの中に、BODYの子供たちが表示される仕組みになっていたのですが、なぜか「server.js」で以下の定義をしているのに//ルートapp.get('/', (req, res) => { res.render('login'); // home.handlebarsをレンダリング});ログイン画面に一向に到達しません。本当に意味が分からなかったので、関連している定義をコメント後して調査を行いました。結論は、「routeフォルダー定義の内容の適用が優先されていた!」です。「Server.Js」の上文で移管定義をしています。const userRoutes = require('./routes/userRoutes');これは、過去の私が、「Server.Js」上でたくさんのルートの定義をするのはソースを汚すと考えたのでconst express = require('express');const router = express.Router();const homeController = require('../controllers/homeController');// Home routerouter.get('/home', homeController.index);module.exports = router;以下のような別のスクリプトファイルにしたからです。で、ここでも問題になったのは、先ほどの「Server.Js」での定義である、//ルートapp.get('/', (req, res) => { res.render('login'); // home.handlebarsをレンダリング});です。知らなかったのですが、「app.get('/', (req, res)」のルート直下の定義は、「一番最初に定義した内容が適用される」です。そう!事前に「const userRoutes = require('./routes/userRoutes');」で読み込んでいていたファイルをすべて確認しました。「routes/index.js」にて以下の定義です。// Home routerouter.get('/', homeController.index);つまり、routeでのアクセス時は、「Server.Js」を変更していも、変わらないわけです。1時時間かかりました!とてもいい戦いでした!そして、次の問題へ5月のソースにてセッション変数が使えなかったところまで、進んでいたのでその調査を行いました。Socket通信でクライアントからサーバーにデータをPOSTして、サーバーサイドでセッション変数に保存しているのですが、なぜか、ログイン認証後のメニュー画面の初期化時に実行するcontrollerクラスで、セッションの中身が「undefined」となり、ログイン認証をしているユーザしかメニューを表示させない仕様が実現できていませんでした。結論!セッションの設定と、Node.JSのセッション定義にはルール設定がある!セッション変数を使用するために、以下のモジュールを使用しています。const session = require('express-session');const sharedSession = require('express-socket.io-session'); // express-sessionとSocket.IOの共有これらのツールはChatGPTから使用例をもとに正しく組み込まれていました。また、メニュー画面のcontrollerでもセッションの基本情報を正常に取得できていました!!でも、実際のセッション値は全く取得できていませんでした。すべてのセッション定義を見直して、内容を確認しても問題ないと判断ししました。そして、残るはセッションの設定定義とこのセッションModuleの仕様にあると判断しました。以下の定義必要なので、「saveUninitialized: false // 初期化されていないセッションを保存しない」をtrueに変更しました。// セッションミドルウェアの設定const sessionMiddleware = session({ secret: 'your-secret-key', // セッション暗号化のための秘密鍵 resave: false, // セッションを強制的に保存しない saveUninitialized: false // 初期化されていないセッションを保存しない});何と、セッション値が保存されたのです!これは何だ?と思いながらこのプロパティの仕様を確認しました。・実際には不要なセッションがストアに保存されることがあり、ストアのリソースを無駄に消費する可能性があります。・例えば、ユーザーがサイトに訪問したが何も操作せずに去った場合でもセッションが保存されるため、セッションストアの負荷が増加します。この仕様で理解しました。Node.JSはASP.NET Core MVC(.NET6)のようにセッションキーさえあればいくらでもセッション値(JSONデータ)が保存されると思っていました。ですが、Node.JS基本的に、セッションの初期化でセッションのカート=セッションキーの領域が事前に定義されていないと「saveUninitialized: false 」では保存でいないかったのです!なので、以下の用に使用するセッションのセッションの部屋を事前に定義したら「saveUninitialized: false 」でうまく行きました。// セッションを初期化するミドルウェアapp.use((req, res, next) => { if (!req.session.isInitialized) { req.session.isInitialized = true; // 初期化フラグ req.session.userdata = {}; // 必要に応じて初期データを設定 } next();});教訓としては、ASP.NET Core MVC(.NET6)の感覚に飲まれていると、固定概念化して問題の解が見えてこなくなります!そして、いい戦いでした!なぜなら、またNode.JSでレベルアップすることができたのですから!!最高に楽しい3時間!!でした!頑張ったね!コウ君!お疲れ様でした。-----------------------------------------------------------------------------------