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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Node.js

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Q&A

解決済

1回答

3575閲覧

何度もDBにアクセスするとERR_EMPTY_RESPONSEエラーがでます。

aomo_study

総合スコア3

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Node.js

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

0グッド

0クリップ

投稿2020/06/09 07:45

編集2020/06/09 08:39
コード ```### 前提・実現したいこと ExpressとNode.jsとPostgreSQLで、掲示板Webページを開発しています。 以下のようになってしまいます。 質問の仕方が分かりずらいかもしれませんが、お力を貸してください。 ### 発生している問題・エラーメッセージ ######何度かアクセス(ページを進めたり投稿したり…)を繰り返すと、 「localhostにアクセスしています」という文字がWebページ左下に出て止まり、先に進みません。 そしてしばらく待った後、

このページは動作していません
localhost からデータが送信されませんでした。
ERR_EMPTY_RESPONSE

と出てきて止まります。 原因がわかりません。 ### 該当のソースコード ```JavaScript const express = require('express'); const router = express.Router(); const uuid = require('uuid'); const passwordHash = require('password-hash'); const pg = require('pg'); const isDebug = true const pool = new pg.Pool({ database: 'dashboard', user: 'postgres', password: 'Kasumin1', host: 'localhost', port: 5432, }); (略) //------------ ここから先はログイン済み--------------- router.all('/authed/*', async function (req, res, next) { console.log("/authed通過") console.log("req.cookies.token=" + req.cookies.token) let client = null let user = null let token = null // トークンチェック //DBアクセスする try{ token = req.cookies.token if(!req.cookies.token)throw new Error(1) if(!pool)return res.redirect('/login?mag=5') client = await pool.connect() if(!client)throw new Error(5) user = await client.query('SELECT name FROM user_token WHERE token=$1;',[token]) if(client){ client.end() } if(!user.rows[0].name)throw new Error(1) req._local = { userInfo: { name: user.rows[0].name } } }catch(err){ if(isDebug) console.log(err) msg = err.message if(client){ client.end() } return res.redirect('/login?msg='+msg) } next() }) //----------------------メインページ------------------------ router.get('/authed/dashboard',async function (req, res, next) { let posts = null let postnumber = 0 let button = 0 let msg = "" let page_count = 0 let pageCount=null let client = null try{ if (!req._local.userInfo.name)return res.redirect('/login?msg=1') if(!pool)throw new Error("DBアクセスに失敗しました。") client = await pool.connect() if(!client)throw new Error("DBアクセスに失敗しました。") //次へ・戻るボタンが押されたらページを変える if (req.query.page_count)page_count = +req.query.page_count //投稿ボタンが押された時のメッセージ if(req.query.msg == 'ok'){ msg = "投稿が完了しました!" }else if(req.query.msg == 'ng'){ msg = "投稿に失敗しました><" } pageCount = await client.query('SELECT * FROM board_posted ORDER BY number DESC OFFSET 10*$1;',[page_count]) if(!pageCount.rowCount)throw new Error("まだ投稿がありません。") if (pageCount.rowCount <= 10) { button = 0 } else { button = 1 } //投稿一覧表示 posts = await client.query('SELECT * FROM board_posted ORDER BY number DESC LIMIT 10 OFFSET 10*$1;',[page_count]) if(!posts.rows)throw new Error("何もありません。") postnumber = await client.query('SELECT number FROM board_posted ORDER BY number DESC;') console.log("postnumber="+postnumber.rows[0].number) }catch(err){ console.log("catchしました") msg = err.message if(client){ client.end() } return res.redirect('/auther/dashboard?page_count='+page_count) } if(client){ client.end() } res.render('dashboard', { username: req._local.userInfo.name, posts: posts.rows, button: button, page_count: page_count, msg: msg, postnumber: postnumber.rows[0].number }); }); //-------------------------投稿------------------------- router.post('/newpost',async function (req, res, next) { console.log("req.cookies.token=" + req.cookies.token) let client = null let username="" let msg = "" let postnumber=+req.body.postnumber console.log("postnumber=" + postnumber) try{ if(!pool)throw new Error("DBアクセスに失敗しました。") client = await pool.connect() if(!client)throw new Error() //例えばもし同時投稿などで44番目の投稿がすでにあったら、postnumberを45番にする number = await client.query('SELECT *FROM board_posted ORDER BY number DESC') if(number.rows[0].number == postnumber)postnumber++ //投稿作業 username = await client.query('SELECT name FROM user_token WHERE token=$1',[req.cookies.token]) if(!username)throw new Error("usernameなかった") await client.query('INSERT INTO board_posted(number,name,text) VALUES($1,$2,$3)',[postnumber,username.rows[0].name,req.body.text]) msg = "ok" }catch(err){ console.log("catchしました") if(isDebug) console.log(err) msg = "ng" if(client){ client.end() } } if(client){ client.end() } res.redirect('/authed/dashboard?msg='+msg) }); //次へボタンや戻るボタンが押されたら router.post('/next', function (req, res, next) { let page_count try{ page_count = Number(req.query.page_count) }catch(err){ console.log("catchしました") return res.redirect('/authed/dashboard?page_count='+page_count) } res.redirect('/authed/dashboard?page_count=' + page_count) }) module.exports = router; // /authed/dahsboard?p=0 // 1ページあたりの表示件数 50件 (plen) // OFFSET= p * plen LIMIST plen ORDER DESC // 次へ /authed/dahsboard?p=(p+1) // 前へ /authed/dahsboard?p=(p-1) // (p+1) ページ目

html

1<!DOCTYPE html> 2<html> 3 4<head> 5 <title>Dashboard</title> 6 <link rel='stylesheet' href='/stylesheets/style.css' /> 7 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" 8 integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"> 9 10</head> 11 12<body> 13 <header> 14 <div class="navbar navbar-dark bg-dark shadow-sm"> 15 <div class="container d-flex justify-content-between"> 16 <a class="navbar-brand d-flex align-items-center"> 17 <strong>Dashboard</strong> 18 </a> 19 </div> 20 </div> 21 22 </header> 23 <br> 24 <div class="card-deck"> 25 <!------------ユーザープロフィール-------------> 26 <div class="card" style="max-width: 18rem; max-height: 18rem;"> 27 <div class="card-header">your plofile</div> 28 <div class="card-body"> 29 <h4 class="card-title"><%= username %></h4> 30 <p class="card-text"> 31 This is where your introduction is written. 32 </p> 33 </div> 34 <a href="/logout">logout</a> 35 </div> 36 37 <!------------ポストされた投稿一覧--------------> 38 39 <div class="d-flex flex-column bd-highlight mb-3"> 40 <div class="row justify-content-center" style='color: red;'><%=msg%></div> 41 <div style='color: red;'></div> 42 <div class="border border-dark" style="padding:10px;background-color:#EEEEEE"> 43 <% if (posts != null) { %> 44 <% for(var i= 0; i < posts.length; i++){ %> 45 <div class="card" style="width: 60rem;"> 46 <%=posts[i].number%> 47 </div> 48 <div class="card-body"> 49 <table border="1"> 50 <tbody> 51 <%=posts[i].text%> 52 <tr> 53 <td><%=posts[i].name%></td> 54 </tr> 55 56 </tbody> 57 </table> 58 </div> 59 <%}%> 60 <%}%> 61 </div> 62 <div class="d-flex"> 63 <% if(page_count >= 1){ %> 64 <form method="post" action="/next?page_count=<%-page_count -1%>"> 65 <button>戻る</button> 66 </form> 67 <% } %> 68 <% if(button == 1){%> 69 <form method="post" action="/next?page_count=<%-page_count +1%>"> 70 <button>次へ</button> 71 </form> 72 <% } %> 73 </div> 74 <!--------------------投稿---------------------> 75 <div class="p-2 bd-highlight"> 76 <form action="/newpost" method="post"> 77 <br> 78 <div><input type="hidden" name="postnumber" value=<%-postnumber+1 %>><%=postnumber+1%>番目の投稿</div> 79 <div>投稿文<br><textarea name="text" cols="50" rows="4" wrap="soft" required></textarea></div> 80 <p>名前:<%=username%></p> 81 <button type="submit">送信</button> 82 </form> 83 </div> 84 </div> 85</div> 86</body> 87</html>

試したこと

変数clientをグローバル変数にする→qyery is not a functionエラーがでてできない。
変数clientをグローバル変数にしてawaitしてプログラムの初めでpool.connect()する→Cannot read property 'query' of undefinedのエラーがでる。

開発環境

windows10
VSCode
PostgreSQL
Node.js
JavaScript
Express

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

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

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

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

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

guest

回答1

0

ベストアンサー

原因がわかりません。

Express のミドルウェアは 通常のコールバック関数を与えてください。
app/router が持つ use(), .all(), .get(), .post() といったミドルウェア登録用API の引数に注目

javascript

1router.all('/authed/*', function middleware(req, res, next) { // 2 /* omitted */ 3}) 4router.get('/authed/dashboard', function middleware2(req, res, next) { // 5 /* omitted */ 6}) 7router.post('/newpost', function middleware3(req, res, next) { // 8 /* omitted */ 9})

巡回機能に非同期関数(async関数)が指定されているため、正しく、next() done() を処理できず、ブラウザに対してサーバーエラーの応答もできなくなったのが原因と思います。

※ミドルウェアに async function を与える、KoaJS というフレームワークもあります。


DBアクセスなど 非同期実装 が必要な場合は

  1. ミドルウェア関数内のスコープ
  2. Moduleスコープ(グローバルに見えますが Module内に限って有効なスコープ)
  3. globalスコープ(NodeJS で Global オブジェクトのプロパティ)

に実装する必要があります。

  1. 別途ユーザ関数を定義
  2. ユーザモジュールを読み込む

掲示板Webページ

Express の修学目的であれば、DB代わりに OSのファイルシステムを使い、
「Expressの実装をコードリーディングして学ぶ」ことに注力するのも有りだと思います。
fs には同期/非同期のAPIが揃っていますし、ストレージ部分を手軽に実装できます。

投稿2020/06/09 09:33

AkitoshiManabe

総合スコア5434

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

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

aomo_study

2020/06/09 13:12

素早くわかりやすいご回答ありがとうございます。 ご回答の通りに実装しなおしたうえで、const poolをローカル関数で定義するようにしたら、正常に動作しました! お時間を割いていただきありがとうございましたm(- -)m
aomo_study

2020/06/09 13:13

修学のアドバイスも、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問