LoginSignup
hositasi1019
@hositasi1019 (koseki akira)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Node.js Express テーブル取得データをブラウザで表示させる方法

参考にしたサイト
https://reffect.co.jp/node-js/express-js-connect-mysql#i-2

ほぼサイトの通りに書いたのですがうまくいかず、
"response.send(result);"の部分に入りませんでした
何かありそうな原因がわかれば教えて頂きたいです!

補足
InsertはDBに反映されるのでうまくいっていると思いますが、その際のresultもselect同様、受け取れませんでした。
不正な値を入力しても"_err = "error";"の中に入りませんでした
ログの取り方が調べてもわからなかったため、画面に直接表示して成功しているかどうか確認しています。

追記
->不正な値を入力しても"err = "error";"の中に入りませんでした
node_modules,package-lock.json,package.jsonの場所が同階層になっておらず、同階層に直したら"
err = "error";"の中には入るようになりました。
しかしselectについてはまだ治りませんでした

追記2
↓の処理をapp.getの外に出してresultを別の変数に詰めたら入るようになりましたが、そういう使い方はしたくないです

const sql = "select * from `users`"
con.query(sql, function (err, result, fields) {
  // ↓ ここに入りたい
  if (err) {
    response.send("select error");    
  };
  response.send(result);
});
app.js
var http = require('http');
const express = require('express');
const app = express();
const mysql = require('mysql');

const con = mysql.createConnection({
  host: 'xxx.xxx.xxx.xxx',
  user: 'xxx',
  password: 'xxxx',
  database: 'xxxx'
});

var _err = "";
con.connect(function(err) {
  if (err) {
    _err = "error";
  };
  console.log('Connected');
});

app.get('/', (request, response) => {

  const sql = "select * from `users`"
  con.query(sql, function (err, result, fields) {
    // ↓ ここに入りたい
    if (err) {
      response.send("select error");    
    };
    response.send(result);
  });
  response.send(_err);
});

app.listen();
0

2Answer

通常のmysqlモジュールは非同期通信になり扱いづらいので、
同期通信(await async)が可能な utilモジュールを使ったサンプルコードです。

同期通信になることで、ネストが少なくなりかなり見やすくなると思います。
SQLの発行は何度も使うと思うので、runQuery関数を作成しそこにmysqlモジュールとutilモジュールをラップして使いやすくしています。

コードの細かな説明はコメントで書いてあるので、ぜひ読んでみてください。
エラー処理も書いてあるので、SQLのコネクションがたくさん繋がったまま、SQLサーバに負担のかからないようになっております。

コードのコメントにも書いてありますが、各種モジュールをコマンドラインでインストールしてください

$ npm i express
$ npm i cors
$ npm i parser
$ npm i util
$ npm i mysql
$ npm i multer
app.js
const express = require('express') // expressモジュールを読み込む
const cors = require('cors') //クロスドメインでアクセスを許可する系のやつ
const body_parser = require('body-parser') //いい感じにGET POSTを解釈するやつ
const util = require('util') // SQL Async/Await
const mysql = require('mysql')
const multer = require('multer') // multerモジュールを読み込む これがないとBODYの中身をうまく読み取らない

//↑ 各種、「npm install」してください
//npm i express
//npm i cors
//npm i parser
//npm i util
//npm i mysql
//npm i multer

const app = express() // expressアプリを生成する

app.use(body_parser())
app.use(cors())//CROS許可
app.use(multer().none()) // multerでブラウザから送信されたデータを解釈する

//サーバの受付ポート番号
const port = 4141
app.listen(port, ()=>{
  console.log(`http://localhost:${port} でリクエストを受け付けます。`)
})

//Async/Awaitを使ったMySQL接続情報★★★★★★★★★★★★★★★★★★★★★
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
const pool_config = {
  host: 'xxxxx',
  user: 'xxxxx',
  password: 'xxxx',
  port: 8889,
  database: 'xxxx',
  timezone: 'xxxx' //timezoneの指定省略の場合はシステムローカルになる
}
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

//汎用的にMySQLクエリを発行する関数
// (mysqlモジュールをラップして使いやすくする)
const runQuery = async (sql, data) => {
  console.log('runQuery...')
  console.log('sql: ' + sql)
  console.log('data: ' + data)

  const pool = mysql.createPool(pool_config)
  try {
    pool.query = util.promisify(pool.query)//これないと動かない

    const run_sql = mysql.format(sql, data)
    console.log('発行されたquery:\n' + run_sql + '\n')

    const result = await pool.query(run_sql)
    // console.log(JSON.stringify(result))
    pool.end() // mysqlのコネクションのプロセスを終了させる。
    return result
  } catch (e) {
    //エラーが発生した場合でもMySQLのconnectionプロセスを終了させる
    pool.end() // mysqlのコネクションのプロセスを終了させる。
  }
}

app.get('/', (request, response, next) => {
  (async () => {
    console.log('「/」へ GETリクエストがありました。')

    //汎用的にMySQLクエリを発行する
    // ?? のところに users が代入されます
    //await async を使うことでコールバック関数が不要になり、見やすくなります。
    const sql_result = await runQuery(
      'select * from ??',
      ['users']
    )

    console.log('SQL 結果')
    console.table(sql_result)

    //レスポンスを返す
    response.json(sql_result)
    //↓これでも動きます!
    // response.send(JSON.stringify(sql_result))

  })(next).catch((e) => {
    //エラー処理
    console.log('サーバエラーが発生しました')
    console.log(e)

    response.json({
      message: 'サーバエラーが発生しました。' + e,
    })
  })
})

1

いまいち直したいことがわからないのですが、selectデータ取れればOKですか?

そうでしたら、app.jsの下から4行目を消したら動きましたよ。
response.send(_err);

0

Your answer might help someone💌