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

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

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

EJSは、JavaScript用のテンプレートエンジン。HTMLなどのテンプレートテキストにJavaScriptのロジックを記述することができます。また、変数・関数の実行をテンプレートテキスト内に埋め込むことも可能です。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Node.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

2604閲覧

Node.js + Express + SQL ServerのDB接続で一覧表示したい

HoroHoro0316

総合スコア8

EJS

EJSは、JavaScript用のテンプレートエンジン。HTMLなどのテンプレートテキストにJavaScriptのロジックを記述することができます。また、変数・関数の実行をテンプレートテキスト内に埋め込むことも可能です。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Node.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2020/04/24 05:14

編集2020/04/26 06:23

はじめに

Node.js + Express + SQL Serverによってデータベースに接続し、そこに登録されているデータを一覧で表示するようなページを作成したかったのですが、上手くデータを引っ張ってこれずに詰まってしまいました。

現状

VScodeのターミナルでnpm startしてlocalhostを起動すると、
npm start

これは正常に表示されます。
top

下記にsqlSample.ejsへのリンクを書いていますので、押しますと、
sqlSample

こうなります。
私なりに少し調べたのですが、変数contentがDBを参照したデータを引っ張ってこれてないのだと思います。

本題

すみません、ここからが本題になります。
フォルダ構成等を下記に示していきます。長くなりますが宜しくお願いします。

どうなっているか

  • フォルダ構成

基本的にはExpress generatorコマンドによって生成してます。こんな感じです。
folder

  • routes/index.js

js

1var express = require('express'); 2var router = express.Router(); 3 4/* GET home page. */ 5router.get('/', function(req, res, next) { 6 res.render('index', { title: 'Express' }); 7}); 8 9router.get('/sqlSample', function(req, res, next) { 10 res.render('sqlSample', { title: 'sqlSample', content: content}); 11}); 12 13module.exports = router;
  • routes/sqlSample.js

js

1var express = require('express'); 2var router = express.Router(); 3 4// Connectionを定義する 5var Connection = require('tedious').Connection; 6 7// SQLServerの接続定義を記載する。 8var config = { 9 server: 'localhost', 10 authentication: { 11 type: 'default', 12 options: { 13 userName: 'admin', 14 password: 'xxxxx' // 伏せてます 15 } 16 }, 17 options: { 18 encrypt: true, 19 database: 'Training01' 20 } 21}; 22 23/* GET users listing. */ 24router.get('/', function (req, res, next) { 25 var connection = new Connection(config); 26 var content = []; 27 28 connection.on('connect', function (err) { 29 if (err) { 30 console.log('SQL Serer connect error.(' + err + ')'); 31 process.exit(); 32 } 33 console.log("connected"); 34 executeStatement(); 35 }); 36 37 connection.on('end', function () { 38 console.log("disconnected"); 39 res.render('sqlSample', { title: '製品一覧', content: content }); 40 }); 41 42 var Request = require('tedious').Request; 43 44 function executeStatement() { 45 request = new Request("SELECT * FROM ProductsMaster with (NOLOCK)", function (err) { 46 if (err) { 47 console.log(err); 48 } 49 }); 50 51 var result = {}; 52 request.on('row', function (columns) { 53 columns.forEach(function (column) { 54 if (column.value === null) { 55 console.log('NULL'); 56 } else { 57 result[column.metadata.colName] = column.value; 58 } 59 }); 60 content.push(result); 61 result = {}; 62 }); 63 64 request.on('requestCompleted', function () { 65 console.log('requestCompleted'); 66 connection.close(); 67 }); 68 69 70 connection.execSql(request); 71 } 72}); 73 74module.exports = router; 75
  • routes/app.js

js

1var sqlSample = require('./routes/sqlSample'); 2 3app.use('/sqlSample', sqlSample);
  • views/sqlSample.ejs

ejs

1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 5 <title><%= title %></title> 6 <link rel='stylesheet' href='/stylesheets/style.css' /> 7 </head> 8 <body> 9 <h1><%= title %></h1> 10 <div role="main"> 11 <table> 12 <tr> 13 <th>製品コード</th> 14 <th>製品名</th> 15 <th>単価</th> 16 </tr> 17 <% content.forEach(function (value, key) { %> 18 <tr> 19 <td><%= value.ProductsCode %></td> 20 <td><%= value.ProductsName %></td> 21 <td><%= value.UnitPrice %></td> 22 </tr> 23 <% }); %> 24 </table> 25 </div> 26 </body> 27 </html>

...すみません、この辺りにつきましては他サイトの情報を参考にして記述させていただきました。
一応、そちらのURLもここに乗せます。

Node.js Expressフレームワークを使用してSQL Serverに接続する(ページ作成)

環境

  • Windows10 Home 64bit
  • Microsoft SQL Server 2019
  • Node.js - v12.16.1
  • npm - 6.13.4
  • Express - 4.16.1

最後に

ご回答くださる方にはご面倒おかけいたしますが、お答えくださると助かります。
お手数おかけします。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

時間がかかりましたが、調査と試行錯誤によりなんとか解決することができました。

  • routes/index.js

js

1var express = require('express'); 2var router = express.Router(); 3 4/* GET home page. */ 5router.get('/', function(req, res, next) { 6 res.render('index', { title: 'Express' }); 7}); 8 9//router.get('/sqlsample'......)のくだりは削除しました。 10 11console.log('index.js is Loaded.'); 12 13module.exports = router;
  • routes/app.js

js

1このファイル内に記述されていた構文は、 2ひとつ上の階層にあるapp.js内のものに統合。
  • routes/sqlSample.js

js

1 2(前略) 3 4// Connectionを定義する 5var Connection = require('tedious').connect; 6 // npm start時にターミナルで注意されたので新しい書き方に変更した 7 8// SQLServerの接続定義を記載する。 9var config = { 10 server: 'localhost', 11 authentication: { 12 type: 'default', 13 options: { 14 userName: 'admin', 15 password: 'xxxxx', // あえて伏せてます 16 } 17 }, 18 options: { 19 encrypt: true, 20 database: 'Training01', 21 trustServerCertificate: true, 22     // npm start時にターミナルで注意されたので新しい項目でtrue/falseを指定した 23 } 24}; 25 26(後略) 27

大まかな変更点はこのような感じです。

あとはSQL Server 2019での設定部分を変更して、DBへのアクセスができるようになった次第です。
ターミナル上でFailed to connect to localhost:1433 - Could not connect (sequence)というエラーに悩まされたため、一応、参考URLを載せておきます(情報古いし英語ですがご了承下さい)。

どうにか以上により解決に至ることができました。

投稿2020/04/27 04:42

編集2020/04/27 07:11
HoroHoro0316

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問