前提
お世話になります。
Node.jsで書かれたメモアプリで、以前はMySQLを接続していたのですが、この度PostgreSQLに移行することになりました。
それに伴い、お尋ねしたい問題がございます。
PostgreSQLと既存のコードが噛み合わない
移行にあたり必要なコードの書き換えなどは一通り終えたつもりなのですが、実行してみたところ、EJSファイルに次のようなエラーが発生してしまいました(EJSというのは、HTML内にJavascriptを簡単に記述できるJSのテンプレートエンジンです)。
app.jsの実行結果
1Listeninng on 8001 2Result { 3 command: 'SELECT', 4 rowCount: 1, 5 oid: null, 6 rows: [ 7 { 8 id: 1, 9 title: 'mikan', 10 content: 'choco', 11 created: 2023-12-01T07:16:14.517Z, 12 modified: 2023-12-01T07:18:47.483Z, 13 is_removed: false, 14 is_locked: false 15 } 16 ], 17 fields: [ 18 Field { 19 name: 'id', 20 tableID: 16399, 21 columnID: 1, 22 dataTypeID: 23, 23 dataTypeSize: 4, 24 dataTypeModifier: -1, 25 format: 'text' 26 }, 27 Field { 28 name: 'title', 29 tableID: 16399, 30 columnID: 2, 31 dataTypeID: 1043, 32 dataTypeSize: -1, 33 dataTypeModifier: 44, 34 format: 'text' 35 }, 36 Field { 37 name: 'content', 38 tableID: 16399, 39 columnID: 3, 40 dataTypeID: 1043, 41 dataTypeSize: -1, 42 dataTypeModifier: 10485764, 43 format: 'text' 44 }, 45 Field { 46 name: 'created', 47 tableID: 16399, 48 columnID: 4, 49 dataTypeID: 1114, 50 dataTypeSize: 8, 51 dataTypeModifier: -1, 52 format: 'text' 53 }, 54 Field { 55 name: 'modified', 56 tableID: 16399, 57 columnID: 5, 58 dataTypeID: 1114, 59 dataTypeSize: 8, 60 dataTypeModifier: -1, 61 format: 'text' 62 }, 63 Field { 64 name: 'is_removed', 65 tableID: 16399, 66 columnID: 6, 67 dataTypeID: 16, 68 dataTypeSize: 1, 69 dataTypeModifier: -1, 70 format: 'text' 71 }, 72 Field { 73 name: 'is_locked', 74 tableID: 16399, 75 columnID: 7, 76 dataTypeID: 16, 77 dataTypeSize: 1, 78 dataTypeModifier: -1, 79 format: 'text' 80 } 81 ], 82 _parsers: [ 83 [Function: parseInteger], 84 [Function: noParse], 85 [Function: noParse], 86 [Function: parseDate], 87 [Function: parseDate], 88 [Function: parseBool], 89 [Function: parseBool] 90 ], 91 _types: TypeOverrides { 92 _types: { 93 getTypeParser: [Function: getTypeParser], 94 setTypeParser: [Function: setTypeParser], 95 arrayParser: [Object], 96 builtins: [Object] 97 RowCtor: null, 98 rowAsArray: false, 99 _prebuiltEmptyResultObject: { 100 >> 31| <% memos.forEach((memo) => { %> 101 32| <li> 102 33| <span class="title-column"><%= memo.title %></span> 103 34| <div class="items"> 104 105memos.forEach is not a function 106 at eval ("C:\\Users\\Kanon\\workspace\\memo-app\\views\\index.ejs":15:14) 107 at index (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:703:17) 108 at tryHandleCache (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:274:36) 109 at View.exports.renderFile [as engine] (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:491:10) 110 at View.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\view.js:135:8) 111 at tryRender (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\application.js:657:10) 112 at Function.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\application.js:609:3) 113 at ServerResponse.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\response.js:1039:7) 114 at Query.<anonymous> (C:\Users\Kanon\workspace\memo-app\app-new.js:20:8) 115 at Query.handleReadyForQuery (C:\Users\Kanon\workspace\memo-app\node_modules\pg\lib\query.js:139:14)
まだPosrgreSQLに不慣れなため、おそらく書き換えの際に書式の間違いや誤字が発生したのだと思いますが、自力ではこれ以上見つけることができず……。
どうか皆様のお知恵をお貸しくださいませ。
該当のソースコード・テーブル
以下のひとつめが新しく作ったPostgreSQLのmemosテーブルの構造、ふたつめが以前から存在したMySQLのmemosテーブルの構造です。
PostgreSQL
1memo_app=# \d memos; 2 テーブル"public.memos" 3 列 | タイプ | 照合順序 | Null 値を許容 | デフォルト 4------------+-----------------------------+----------+---------------+----------------------------------- 5 id | integer | | not null | nextval('memos_id_seq'::regclass) 6 title | character varying(40) | | | 'Untitled'::character varying 7 content | character varying(10485760) | | | 8 created | timestamp without time zone | | not null | CURRENT_TIMESTAMP 9 modified | > 引用テキストtimestamp without time zone | | not null | CURRENT_TIMESTAMP 10 is_removed | boolean | | not null | false 11 is_locked | boolean | | not null | false 12インデックス: 13 "memos_pkey" PRIMARY KEY, btree (id) 14トリガー: 15 update_tri BEFORE UPDATE ON memos FOR EACH ROW EXECUTE FUNCTION set_update_time()
MySQL
1mysql> desc memos; 2+----------------+----------------+------+-----+-------------------+-----------------------------------------------+ 3| Field | Type | Null | Key | Default | Extra | 4+----------------+----------------+------+-----+-------------------+-----------------------------------------------+ 5| id | int | NO | PRI | NULL | auto_increment | 6| title | varchar(40) | YES | | Untitled | | 7| content | varchar(16383) | YES | | NULL | | 8| created | timestamp | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED | 9| modified | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP | 10| modified_stamp | varchar(15) | YES | | NULL | STORED GENERATED | 11| is_removed | tinyint(1) | NO | | 0 | | 12| is_locked | tinyint(1) | NO | | 0 | | 13+----------------+----------------+------+-----+-------------------+-----------------------------------------------+ 148 rows in set (0.05 sec)
イタリックテキスト
また、該当のJSファイルとEJSファイルはこちらです。
app.js(/indexと周辺のみ)
1const express = require('express'); 2const mod = require('./module') 3const app = express(); 4 5app.use(express.static('public')); 6app.use(express.urlencoded({extended: false})); 7 8// Memo Listの取得 9app.get('/index', (req, res) => { 10 const connection = mod.connection; 11 connection.query( 12 'SELECT * FROM memos WHERE is_removed = false', 13 (err, data) => { 14 console.log(data.rows); 15 res.render('index.ejs', {memos: data.rows}); 16 connection.end(); 17 } 18 ); 19});
module.js
1const { Client } = require('pg'); 2 3const connection = new Client({ 4 user: 'postgres', 5 host: 'localhost', 6 database: 'hoge', 7 password: 'huga', 8 port: 5432, 9}); 10 11connection.connect(); 12 13module.exports = { 14 connection 15}
index.ejs
1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>Kanon's Memo</title> 8 <link rel="icon" href="/images/black-cat.png"> 9 <link rel="stylesheet" href="/css/style.css"> 10</head> 11<body> 12 <%- include('header'); %> 13 <main> 14 <div class="index-container"> 15 <div class="container-header"> 16 <div class="container-title"> 17 <h1>Memo List</h1> 18 <img src="/images/black-cat.png" alt="S-cat" class="cat-image"> 19 </div> 20 <div class="button"> 21 <a href="/trash"class="optional-button move-button">Trash</a> 22 <a href="/new" class="optional-button">+ New</a> 23 </div> 24 </div> 25 <div class="index-table-wrapper"> 26 <div class="table-head"> 27 <span class="title-column">Name</span> 28 <span class="modified-column">Last Modified</span> 29 </div> 30 <ul class="table-body"> 31 <% memos.forEach((memo) => { %> 32 <li> 33 <span class="title-column"><%= memo.title %></span> 34 <div class="items"> 35 <span class="modified-column"><%= memo.modified %></span> 36 <div class="icon-area"> 37 <div class="menu-icon"> 38 <div></div> 39 <div></div> 40 <div></div> 41 </div> 42 <ul class="menu-content"> 43 <li><a href="/edit/<%= memo.id %>">Edit</a></li> 44 <li><form action="/remove/<%= memo.id %>" method="post"> 45 <input type="submit" value="Remove"> 46 </form></li> 47 </ul> 48 </div> 49 </div> 50 </li> 51 <% }); %> 52 </ul> 53 </div> 54 </div> 55 <div class="footer"> 56 <small class="copy-right">© 2023 kanon</small> 57 </div> 58 </main> 59</body> 60</html>
他にご入用の情報があれば仰っていただければ追記いたします。
補足情報(FW/ツールのバージョンなど)
実行環境はWindows11です。
Node: v16.14.2
MySQL: v8.0.3
PostgreSQL: v16.1
どうぞよろしくお願いいたします。
追記
こちらの投稿にて同時に質問していた「PostgreSQLの生成列でTo_charを使いたい」という問題は、本題がふたつ存在したことで分かり辛くなってしまったため、別の投稿に移動いたしました。
https://teratail.com/questions/5xbktfa8l5dr0f
また、こちらの投稿ででいただいたアドバイスを試してみたところ、出力結果に進歩が見られましたので、別の投稿に移動することになりました。続きはこちらをご覧いただければと思います。
https://teratail.com/questions/2k3v2jas7rn82h
お付き合いいただいている皆様にはご不便をおかけしてしまい、誠に申し訳ございません。
回答1件
あなたの回答
tips
プレビュー