kenken0413
@kenken0413

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Cannot read properties of undefined (reading 'progress')

解決したいこと

案件一覧から、個別ページ(project)に移動したときに、その案件の内容(現場名(title)、進捗(progress)など)を表示する機能を実装しています
aタグで囲った場合はエラーが出るものの表示はされます
spanタグの場合はエラー分が表示され、個別ページが表示されません

発生している問題・エラー

TypeError: /Users/ken/node/crm-system/views/project.ejs:18
    16|       <div>
    17|         <span>進捗</span>
 >> 18|         <a><%= project.progress %></a>
    19|         <span>現場名</span>
    20|         <a><%= project.title %></a>
    21|         <span>工事内容</span>

Cannot read properties of undefined (reading 'progress')
    at eval ("/Users/ken/node/crm-system/views/project.ejs":15:34)
    at project (/Users/ken/node/crm-system/node_modules/ejs/lib/ejs.js:703:17)
    at tryHandleCache (/Users/ken/node/crm-system/node_modules/ejs/lib/ejs.js:274:36)
    at exports.renderFile [as engine] (/Users/ken/node/crm-system/node_modules/ejs/lib/ejs.js:491:10)
    at View.render (/Users/ken/node/crm-system/node_modules/express/lib/view.js:135:8)
    at tryRender (/Users/ken/node/crm-system/node_modules/express/lib/application.js:657:10)
    at Function.render (/Users/ken/node/crm-system/node_modules/express/lib/application.js:609:3)
    at ServerResponse.render (/Users/ken/node/crm-system/node_modules/express/lib/response.js:1039:7)
    at Query.<anonymous> (/Users/ken/node/crm-system/app.js:71:11)
    at Query.<anonymous> (/Users/ken/node/crm-system/node_modules/mysql/lib/Connection.js:526:10)```

ソースコード

project.ejs
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>CRM-SYSTEM</title>
    <link rel ="stylesheet" href="/css/style.css">
    <script src="send_url.js"></script>
  </head>
  <body>
    <%- include('header'); %>
    <div class="container">
      <di class="container-header">
        <h1></h1>
        <a href="/edit" class="edit-button">編集</a>
      </div>
      <div>
        <span>進捗</span>
        <a><%= project.progress %></a>
        <span>現場名</span>
        <a><%= project.title %></a>
        <span>工事内容</span>
        <a><%= project.detail %></a>
        <span>住所</span>
        <a><%= project.address %></a>
      </div>
    </div>
  </body>
</html>
app.ejs
const express = require('express');
const mysql = require('mysql');
const session = require('express-session');
const bcrypt = require('bcrypt');
const app = express();

app.use(express.static('public'));
app.use(express.urlencoded({ extended: false }));

const connection = mysql.createConnection({
  // host: 'localhost',
  host:'127.0.0.1',
  user: 'root',
  password: 'password',
  database: 'crm_system'
});

app.get('/', (req, res) => {
  res.render('top.ejs');
});

app.get('/index', (req, res) => {
  connection.query(
    'SELECT * FROM projects',
    (error, results) => {
      res.render('index.ejs', {projects: results});
    }
  );
});

app.get('/new',(req,res) =>{
  res.render('new.ejs');
});

app.post('/create',(req,res) => {
  console.log(req.body);
  const title = req.body.title;
  const detail = req.body.detail;
  const address = req.body.address;
  const progress = req.body.progress;
  connection.query(
    'INSERT INTO projects (title,detail,address,progress)VALUES(?, ?, ?, ?)',
    [title,detail,address,progress],
    (error,results) => {
      res.redirect('/index');
    }
  );
});

app.get('/project/:id',(req,res) => {
  const id = req.params.id;
  connection.query(
    'SELECT * FROM projects WHERE id = ?',
    [id],
    (error,results) => {
      res.render('project.ejs',{ project: results[0] });
    }
  );
});

app.get('/edit/:id/',(req,res) =>{
  res.render('edit.ejs');
});

app.listen(3000);

mysql> SELECT * FROM projects;
+----+-----------+-----------+--------------+-----------------------+
| id | title     | progress  | detail       | address               |
+----+-----------+-----------+--------------+-----------------------+
|  1 | 中村邸    | 施工前    | 内装工事     | 岐阜県中津川市        |
|  2 | 鈴木      |           |              |                       |
+----+-----------+-----------+--------------+-----------------------+
2 rows in set (0.00 sec)

自分で試したこと

1.console.log(progress)や(req.body.progress)で出力
=>undefined

2.クエリ内のWHERE id = ?を削除
=>変化なし

3.プロパティがない、というエラーなので変数を再定義してみる
=>変化なし

4.aタグに変更
=>表示はされるがコンソール上にエラーが発生

aタグの場合に限りデータの受け渡しがされていますが、console.logがundefinedで
エラーがpropertiesがundefinedということは、connection.query内の参照方法が
違っているのでしょうか?

0

1Answer

環境が無いため試せませんが、
app.ejsの56行目の[0]を消して、res.render('project.ejs',{ project: results });として、
参照する側project.ejsの18,20,22,24行目のproject[0]をつけて、<a><%= project[0].progress %></a>とすると、どうでしょうか?

1Like

Comments

  1. @kenken0413

    Questioner

    ありがとうございます、ご指摘の件を試してみましたが、エラーメッセージに変化ありませんでした。

  2. そうでしたか・・・

    index.ejsとの違いを見たいのですが、index.ejsを掲示可能でしょうか?

  3. @kenken0413

    Questioner

    index.ejsを記載します、ご確認宜しくお願いいたします。

    index.ejs
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <title>CRM-SYSTEM</title>
        <link rel ="stylesheet" href="/css/style.css">
        <script src="send_url.js"></script>
      </head>
      <body>
        <%- include('header'); %>
        <div class="container">
          <div class="container-header">
            <h1>案件一覧</h1>
            <a href="/new" class="new-button">新規登録</a>
          </div> 
          <div class="index-table-wrappers">
            <div class="table-head">
              <span class="progress-column">進捗</span>
              <span class="title-column">現場名</span>
              <span class="detail-column">工事内容</span>
              <span class="address-column">住所</span>
            </div>
            <ul class="table-body">
              <% projects.forEach((project) => { %>
                <li>
                  <a href="/project/<%= project.id %>">
                    <div class="project-data">
                      <span class="progress-column"><%= project.progress %></span>
                      <span class="title-column"><%= project.title %></span>
                      <span class="detail-column"><%= project.detail %></span>
                      <span class="address-column"><%= project.address %></span>
                    </div>
                  </a>
                </li>
              <% }) %>
            </ul>
          </div>     
        </div>
      </body>
    </html>
    
  4. index.ejsとは整合取れてますね。

    環境が無いので手詰まりなんですが、

    元のコードでproject.ejsにてCannot read properties of undefined (reading 'progress')が出る直前にconsole.log(project)して、projectの中を見ることは可能でしょうか?

    どんなオブジェクトを受け取っているのかを確認したいです。

  5. @kenken0413

    Questioner

    ありがとうございます、以下のような結果になりました。

    index.ejs(抜粋)
      <body>
        <%- include('header'); %>
        <div class="container">
          <di class="container-header">
          </div>
          <% console.log(project) %>
          <div>
            <span>進捗</span>
            <span><%= project.progress %></span>
            <span>現場名</span>
            <span><%= project.title %></span>
            <span>工事内容</span>
            <span><%= project.detail %></span>
            <span>住所</span>
            <span><%= project.address %></span>
          </div>
        </div>
      </body>
    

    結果

    RowDataPacket {
      id: 1,
      title: '中村邸',
      progress: '施工前',
      detail: '内装工事',
      address: '岐阜県中津川市'
    }
    undefined
    TypeError: /Users/ken/node/crm-system/views/project.ejs:17
        15|       <div>
        16|         <span>進捗</span>
     >> 17|         <span><%= project.progress %></span>
        18|         <span>現場名</span>
        19|         <span><%= project.title %></span>
        20|         <span>工事内容</span>
    
    Cannot read properties of undefined (reading 'progress')
        at eval ("/Users/ken/node/crm-system/views/project.ejs":18:34)
        at project (/Users/ken/node/crm-system/node_modules/ejs/lib/ejs.js:703:17)
        at tryHandleCache (/Users/ken/node/crm-system/node_modules/ejs/lib/ejs.js:274:36)
        at exports.renderFile [as engine] (/Users/ken/node/crm-system/node_modules/ejs/lib/ejs.js:491:10)
        at View.render (/Users/ken/node/crm-system/node_modules/express/lib/view.js:135:8)
        at tryRender (/Users/ken/node/crm-system/node_modules/express/lib/application.js:657:10)
        at Function.render (/Users/ken/node/crm-system/node_modules/express/lib/application.js:609:3)
        at ServerResponse.render (/Users/ken/node/crm-system/node_modules/express/lib/response.js:1039:7)
        at Query.<anonymous> (/Users/ken/node/crm-system/app.js:56:11)
        at Query.<anonymous> (/Users/ken/node/crm-system/node_modules/mysql/lib/Connection.js:526:10)
    
    

    projectを見たときに、RowDataPacketというところでproject(id:1)の情報を取得していて、undefinedとなっている別のデータを参照している、ということなんでしょうか?

  6. @kenken0413

    Questioner

    ちなみに、以前にご指摘いただいた[0]を消した場合、console.logの中身が

    [
      RowDataPacket {
        id: 2,
        title: '鈴木',
        progress: '',
        detail: '',
        address: ''
      }
    ]
    []
    

    といった形に変化し、エラーメッセージが消えましたがprojectページで上記データが表示されないようになります。
    エラーは残るのですが、データの受け渡し自体はできていることから、今回は質問をクローズに変更させていただきます。
    引き続き原因についてはご教示いただいた方法で試してみますが、今は一旦、制作自体を進めてみようと思います。

    何度もお手数おかけいたしました。ありがとうございました。

  7. RowDataPacket {
    id: 1,
    title: '中村邸',
    progress: '施工前',
    detail: '内装工事',
    address: '岐阜県中津川市'
    }

    納得がいかない結果でした。(project. progressが在るように見える)

    もう、クローズされていますが、もし可能であれば、同じタイミングで、
    for (var p in project) console.log(p);を試してもらいたいです。

    このまま モヤモヤ だと、眠れません・・・

  8. @kenken0413

    Questioner

    ありがとうございます、ご指示内容実行の結果、以下のような出力となりました。(抜粋)

    project.ejs
       <div>
            <% for (var p in project) console.log(p); %>
            <span>進捗</span>
            <span><%= project.progress %></span>
            <span>現場名</span>
            <span><%= project.title %></span>
            <span>工事内容</span>
            <span><%= project.detail %></span>
            <span>住所</span>
            <span><%= project.address %></span>
          </div>
    
    id
    title
    progress
    detail
    address
    TypeError: /Users/ken/node/crm-system/views/project.ejs:13
        11|     <div class="container">
        12|       <di class="container-header">
     >> 13|         <a href="/edit/<%= project.id%>" class="edit-button">編集</a>
        14|       </div>
        15|       <div>
        16|         <% for (var p in project) console.log(p); %>
    
    Cannot read properties of undefined (reading 'id')
        at eval ("/Users/ken/node/crm-system/views/project.ejs":15:34)
        at project (/Users/ken/node/crm-system/node_modules/ejs/lib/ejs.js:703:17)
        at tryHandleCache (/Users/ken/node/crm-system/node_modules/ejs/lib/ejs.js:274:36)
        at exports.renderFile [as engine] (/Users/ken/node/crm-system/node_modules/ejs/lib/ejs.js:491:10)
        at View.render (/Users/ken/node/crm-system/node_modules/express/lib/view.js:135:8)
        at tryRender (/Users/ken/node/crm-system/node_modules/express/lib/application.js:657:10)
        at Function.render (/Users/ken/node/crm-system/node_modules/express/lib/application.js:609:3)
        at ServerResponse.render (/Users/ken/node/crm-system/node_modules/express/lib/response.js:1039:7)
        at Query.<anonymous> (/Users/ken/node/crm-system/app.js:56:11)
        at Query.<anonymous> (/Users/ken/node/crm-system/node_modules/mysql/lib/Connection.js:526:10)
    
    app.ejs
    const express = require('express');
    const mysql = require('mysql');
    const session = require('express-session');
    const bcrypt = require('bcrypt');
    const app = express();
    
    app.use(express.static('public'));
    app.use(express.urlencoded({ extended: false }));
    
    const connection = mysql.createConnection({
      // host: 'localhost',
      host:'127.0.0.1',
      user: 'root',
      password: 'password',
      database: 'crm_system'
    });
    
    app.get('/', (req, res) => {
      res.render('top.ejs');
    });
    
    app.get('/index', (req, res) => {
      connection.query(
        'SELECT * FROM projects',
        (error, results) => {
          res.render('index.ejs', {projects: results});
        }
      );
    });
    
    app.get('/new',(req,res) =>{
      res.render('new.ejs');
    });
    
    app.post('/create',(req,res) => {
      console.log(req.body);
      const title = req.body.title;
      const detail = req.body.detail;
      const address = req.body.address;
      const progress = req.body.progress;
      connection.query(
        'INSERT INTO projects (title,detail,address,progress)VALUES(?, ?, ?, ?)',
        [title,detail,address,progress],
        (error,results) => {
          res.redirect('/index');
        }
      );
    });
    
    app.get('/project/:id',(req,res) => {
      const id = req.params.id;
      connection.query(
        'SELECT * FROM projects WHERE id = ?',
        [id],
        (error,results) => {
          res.render('project.ejs',{ project: results[0] });
        }
      );
    });
    
    app.get('/edit/:id',(req,res) =>{
      connection.query(
        'SELECT * FROM projects WHERE id = ?',
        [req.params.id],
        (error,results) =>{
          res.render('edit.ejs',{project:results[0]});
        }
      );
    });
    
    app.post('/update/:id',(req,res) =>{
      const title = req.body.p_title;
      const detail = req.body.p_detail;
      const address = req.body.p_address;
      const progress = req.body.p_progress;
      const id = req.params.id
      connection.query(
        'UPDATE projects SET title=?, detail=?, address=?, progress=? WHERE id=?',
        [title , detail , address , progress , id],
        (error,results) =>{
          res.redirect('/index');
      });
    });
    
    app.listen(3000);
    

    ※一部編集機能の追加のため、コード書き換えている部分あります
    ※エラー箇所は変わってしまい、依然エラーが出る状態ですが、projectページの表示・編集ページの表示と更新まで機能的には動作しています。

  9. どう思われます?
    逆に質問を返すのも変ですが、

    これまでの結果から、projectオブジェクトにはprogressプロパティが存在しているとしか見えません。
    もちろん、progress以外のid,title,detail,addressもです。

    環境が無く自分が動かして確認することができないのでギブアップ状態ですが、
    以下のように書いてみたら、どうなりますか?

    project.idproject.RowDataPacket.id
    project.progressproject.RowDataPacket.progress

    お役に立てず、すみませんでした。
    返信は不要です。

  10. 環境構築して再現させましたが、原因は不明です。ネットで類似事象を検索しましたが、どれも回答が得られていませんでした。
    ポイントは、下記console.log(project)出力の最後のundefinedだと思うのですが、表示はできているで謎です。
    (node.jsはundefinedで、Expressは認識できている??)

    RowDataPacket {
    id: 1,
    title: '中村邸',
    progress: '施工前',
    detail: '内装工事',
    address: '岐阜県中津川市'
    }
    undefined

  11. エラーが出る原因は不明のままですが、回避策を見つけました。
    ローカル変数を使うと、エラーが出なくなりました。

    project.ejs
    +     <% var pj = {}; for (var p in project) pj[p] = project[p]; %>
          <div>
            <span>進捗</span>
    -       <a><%= project.progress %></a>
    +       <a><%= pj.progress %></a>
            <span>現場名</span>
    -       <a><%= project.title %></a>
    +       <a><%= pj.title %></a>
            <span>工事内容</span>
    -       <a><%= project.detail %></a>
    +       <a><%= pj.detail %></a>
            <span>住所</span>
    -       <a><%= project.address %></a>
    +       <a><%= pj.address %></a>
          </div>
    

Your answer might help someone💌