前提・実現したいこと
現在、express
のapp
を使って
当月と前月以前のデータと動画の表示の処理をし、
またHTML側の月の遷移により
post
と get
で同じSQLを動かしたいため、
app.use
で'/*'
にて共通処理としました。
ところがリダイレクトにより app.use('/*')
が
複数回処理されていることがわかりました。
この事から、SQLを無駄に動かさないように
app.use
の共通処理をやめ、
get
post
ともに1度だけSQLを実行すべく
function
でモジュール化しましたが、
知識が乏しいので、undefined is not a function
と
怒られました。
どのようにモジュール化すればよいか、ご教示いただけると嬉しいです。
発生している問題・エラーメッセージ
express
1const express = require('express'); 2const app = express() 3const mysql = require('mysql2/promise'); 4// ~省略~ 5const ddate = new Date();// 今日を取得 6var yymm = ddate.toFormat("YYMM"); // 2101形式でセット 7 8function getColumnData(num, result, column){ 9// ここで連想配列から配列にセットし直してreturn 10} 11// ここにfunction getSQLData(sql)を設置 12 13app.set('ejs', ejs.renderFile); 14const pool = mysql.createPool({ 15 host: 'localhost', 16 user: 'root', 17 password: 'test', 18 database: 'test', 19}); 20app.use('/', express.static(path.join(__dirname, 'stream')));// Movie 21app.use('/', express.static(path.join(__dirname, 'image')));// mp4ファイルのサムネイル用 22app.post('/views/', async(request, response, next) => { 23 yymm = ${request.body.test}`; // postで年月情報取得 24 next(); 25}); 26app.get('/', ,async( request, response, next ) => { 27 moveImage();// 取得写真を別フォルダに移動 28 makeMovie();// 写真から動画生成 exec(`ffmpeg ... 29 console.log("app.get"); 30 next(); 31}); 32app.use('/*',async( request, response ) => { 33 try{ 34 // SQLによるDBデータ取得 35 sql = `select * from test where yymm = '${yymm}'`; 36 var [data] = await pool.query(Sql); 37 // var data = await getSQLData(sql); とセット 38 // ここでは1個ですが、実際には5個のSQLを動かしていて 39 // getColumnDataモジュールで配列に置き換えた処理を4個動かしています 40 response.render('test.ejs',{ 41 data: data, 42 item: item, 43 ... 44 }); 45 } 46 catch(err){ 47 console.log(`catch: ${err}`); 48 }; 49 console.log("Successful"); 50}); 51 52https.createServer(options, app).listen(port,() => { 53 console.log('server start'); 54});
javascript
1// console 2 3node test.js 4app.get 5server start 6Successful 7Successful
やった事
express
1function getSQLData(sql){ 2 var [data] = pool.query(sql); 3 return data; 4}
また、こうした方がいいんじゃない?という上記ソースを全く変えてしまう
お答えでも、全然かまいません。
すいませんが、よろしくお願い致します。
解決後の備忘録
今回の変更箇所を記載しておきます。
function
から const 変数名
に変更。
express
1const getSQLData = async()=>{ 2 sql = `select * from test where yymm = '${yymm}'`; 3 // グローバル変数にセット 4 var [Gl_Data] = await pool.query(Sql); 5 ... 6};
変更後がこちら↓
express
1const express = require('express'); 2const app = express() 3const mysql = require('mysql2/promise'); 4// グローバル宣言 5var tmpData; 6var gl_Data; 7var gl_Item; 8... 9// ~省略~ 10const ddate = new Date();// 今日を取得 11var yymm = ddate.toFormat("YYMM"); // 2101形式でセット 12 13function getColumnData(num, result, column){ 14// ここで連想配列から配列にセットし直してreturn 15} 16// SQLの実行関数 17const getSQLData = async()=>{ 18 // SQLによるDBデータ取得 19 sql = `select * from test where yymm = '${yymm}'`; 20 var [Gl_Data] = await pool.query(Sql); 21 ... 22}; 23 24app.set('ejs', ejs.renderFile); 25const pool = mysql.createPool({ 26 host: 'localhost', 27 user: 'root', 28 password: 'test', 29 database: 'test', 30}); 31app.use('/', express.static(path.join(__dirname, 'stream')));// Movie 32app.use('/', express.static(path.join(__dirname, 'image')));// mp4ファイルのサムネイル用 33app.post('/views/', async(request, response, next) => { 34 yymm = ${request.body.test}`; // postで年月情報取得 35 // SQLによるDBデータ取得 36 await getSQLData(); 37 next(); 38}); 39app.get('/', async( request, response, next ) => { 40 moveImage();// 取得写真を別フォルダに移動 41 makeMovie();// 写真から動画生成 exec(`ffmpeg ... 42 console.log("app.get"); 43 44 // SQLによるDBデータ取得 45 await getSQLData(); 46 next(); 47}); 48app.use('/*',async( request, response, next ) => { 49 try{ 50 // getColumnDataモジュールで配列に置き換えた処理を4個動かしています 51 var data = getColumnData(hogeNum, gl_Data, 'data');// 配列に置き換え 52 var item = getColumnData(hogeNum, gl_Item, 'item');// 配列に置き換え 53 response.render('test.ejs',{ 54 data: data, 55 item: item, 56 ... 57 }); 58 } 59 .catch(err){ 60 // html側にエラー状況を通告 61 response.status(404).send('404 error, Page Not found'); 62 // コンソール側にエラーを表示 63 console.log(`catch: ${err}`); 64 }; 65 console.log("Successful"); 66}); 67 68https.createServer(options, app).listen(port,() => { 69 console.log('server start'); 70});
うん、スッキリしました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/29 04:38 編集
2021/01/29 06:16
2021/01/29 06:49