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

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

ただいまの
回答率

88.91%

Windows 10でnode.jsからPostgreSQLのデーターベースに読み書きしたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 189

2020/07/26現在

まだ解決はしていません。
Linux環境で動作確認ができましたので、Windows環境の問題だと思います。
何かしらお気づきの点がございましたらコメントをよろしくお願いいたします。

前提・実現したいこと

Node.jsとPostgreSQLを使って、ローカルのWindows10マシンで動く掲示板を作っています。
N予備校というサービスの教材です。

PostgreSQLに掲示板の投稿内容を保存して表示したいです。

掲示板のソースはここにあるものです。
progedu/intro-curriculum-3022 at master-2020
N予備校の教材としてはVirtualBox+Vagrant+Ubuntuを前提なのですが、Windowsで動作させたいと思っています。
N予備校では動作保証外なので、こちらで質問させていただいています。

発生している問題・エラーメッセージ

node index.jsでサーバーを起動してブラウザでアクセスすると接続中のままで表示されません。

このような状況でデーターベースを確認すると以下のようなメッセージになります。

psql -U postgres
psql (12.3)
"help"でヘルプを表示します。
postgres=#\c secret_board
データベース"secret_board"にユーザ"postgres"として接続しました。
secret_board=#select * from "Post";
ERROR:  リレーション"Post"は存在しません
行 1: select * from "Post";
                    ^
secret_board=#

該当のソースコード

以下が掲示板のソースコードです。
progedu/intro-curriculum-3022 at master-2020

これ以外でもN予備校のPostgreSQLを利用したプログラムが同じように動作しない状況です。

post.js

intro-curriculum-3022/post.js at master-2020 · progedu/intro-curriculum-3022

'use strict';
const Sequelize = require('sequelize');
const sequelize = new Sequelize(
  'postgres://postgres:postgres@localhost/secret_board',
  {
    logging: false
  });
const Post = sequelize.define('Post', {
  id: {
    type: Sequelize.INTEGER,
    autoIncrement: true,
    primaryKey: true
  },
  content: {
    type: Sequelize.TEXT
  },
  postedBy: {
    type: Sequelize.STRING
  },
  trackingCookie: {
    type: Sequelize.STRING
  }
}, {
    freezeTableName: true,
    timestamps: true
  });

Post.sync();
module.exports = Post;

posts-handler.js

intro-curriculum-3022/posts-handler.js at master-2020 · progedu/intro-curriculum-3022

'use strict';
const pug = require('pug');
const util = require('./handler-util');
const Post = require('./post');

function handle(req, res) {
  switch (req.method) {
    case 'GET':
      res.writeHead(200, {
        'Content-Type': 'text/html; charset=utf-8'
      });
      Post.findAll().then((posts) => {
        res.end(pug.renderFile('./views/posts.pug', {
          posts: posts
        }));
      });
      break;
    case 'POST':
      let body = [];
      req.on('data', (chunk) => {
        body.push(chunk);
      }).on('end', () => {
        body = Buffer.concat(body).toString();
        const decoded = decodeURIComponent(body);
        const content = decoded.split('content=')[1];
        console.info('投稿されました: ' + content);
        Post.create({
          content: content,
          trackingCookie: null,
          postedBy: req.user
        }).then(() => {
          handleRedirectPosts(req, res);
        });
      });
      break;
    default:
      util.handleBadRequest(req, res);
      break;
  }
}

function handleRedirectPosts(req, res) {
  res.writeHead(303, {
    'Location': '/posts'
  });
  res.end();
}

module.exports = {
  handle
};

試したこと

  • PostgreSQLはインストールしてPgAdmin 4から起動、ブラウザで動作
  • コマンドプロンプトからpsql -U postgresでコマンド画面起動
  • create database secret_board;でデーターベースを作成
  • FirefoxでもGoogle Chromeでも動作は同じ状況
  • node-postgresモジュールのサンプルを実行しましたが、コンソールに何も表示されません。
    Connecting | node-postgres

netstatというコマンドでは以下のように出ます。
netstat | grep 5432

  TCP         [::1]:4244             (私のPC名):5432            ESTABLISHED
  TCP         [::1]:4247             (私のPC名):5432            ESTABLISHED
  TCP         [::1]:5432             (私のPC名):4244            ESTABLISHED
  TCP         [::1]:5432             (私のPC名):4247            ESTABLISHED

PostgreSQL Portable

PostgreSQL Portableという別のものも試しましたが、やはりnode.jsへのアクセスのところでうまくいきませんでした。
コマンド画面やコマンドプロンプトからのログイン、データーベースの作成はできました。

Vagrant + Ubuntu環境で動作確認(2020/07/26)

  • 同じソースを実行してみたところデーターベースに保存できました。

補足情報(FW/ツールのバージョンなど)

pg_hba.confの一部

# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust

node.jsの動作

PostgreSQLを使用しないnode.jsのプログラムは、サーバーを起動できてブラウザで表示できています。

どうぞよろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • smile_20200722

    2020/07/23 23:48

    >saziさん
    ご回答ありがとうございます。
    現在、サービス側に問い合わせ中です。
    このプログラムでいうところのPostは自分で作成しなければならないということでしょうか?
    教材には secret_board というデーターベースの作成のみが載ってます。
    post.jsの4行目では、IDやパスワード、データーベース名を指定しているように見えますし、
    8行目でもPostの記述があるのですが、自動的に作成はされないのでしょうか?

    キャンセル

  • Orlofsky

    2020/07/24 03:13

    >ご指摘ありがとうございます。リンクを修正させていただきました。
    ひとつも直っていません。

    キャンセル

  • smile_20200722

    2020/07/24 09:04

    >Orlofskyさん
    確認不足ですみません。
    今度は修正できていますでしょうか?

    キャンセル

回答 1

0

「入門コースの3章22節」を学んでいるみたいですが、そこに「データベースにテーブルを作る」みたいな事が書いてありませんか?テーブルの名前は Post です。
書いてない場合は動作保証外とか関係なく先生に質問した方がよいですよ。環境の問題ではないので。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/23 23:35

    ご回答ありがとうございます。

    現在、問い合わせ中です。

    講義にはデーターベースを作成するcreate database secret_board;はありますが、
    テーブルを作成する内容は載っていません。

    キャンセル

  • 2020/07/24 04:26 編集

    コメント通知があったので質問を見返したのですが、post.js を実行しても「”同じように”動作しない」ですか?「同じように」というのは「同じエラーで」と理解しますが、同じエラーですか?
    また、post.js を実行してテーブル Post を作る、とかテキストに書かれていませんか?

    キャンセル

  • 2020/07/24 09:58

    ブラウザが接続中のままになる状況は同じです。

    テキストにデーターモデリングとしての設計とそれをnode.jsのsequelizeモジュールとしてどのように
    記述するかの説明はあります。
    「データーベースに保存する」という項目で、posts-handler.jsのPOSTメソッドに追記するように
    書かれています。
    それ自体を記述して実行しています。

    posts-handler.jsのソースを該当のソースコードに追加しました。

    他のプログラムという意味について説明不足でしたので書かせていただきます。
    これはこの掲示板プログラム以外のPostgreSQLのプログラムという意味ではありませんでした。
    N予備校では、同じプログラムを少しずつ機能追加して章が進んでいきます。
    章の始めには、前章の内容を指定のリポジトリからクローンしてテキストの指示にしたがい修正し、実行します。
    そして練習問題でそこまでのテキストで機能追加された別のリポジトリからフォークしてプルリクまでを行います。
    他のプログラムという言い方は、この別のリポジトリをそれぞれ実行しても同じ状況になっているという
    意味でした。

    何かお気づきの点がございましたらどうぞよろしくお願いいたします。

    キャンセル

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る