-
Notifications
You must be signed in to change notification settings - Fork 15
/
index.js
135 lines (119 loc) · 4.55 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
* server/index.js
*
* @author Michael S. Mikowski - mike.mikowski@gmail.com
*
* Use : node index
* Synopsis : Development server
* Provides : Basic web services
* Requires : xhi-make-util
*
*
*/
/*global*/
// == BEGIN MODULE SCOPE VARIABLES ====================================
'use strict';
const
// Load libs (enable fsObj when required)
// fsObj = require( 'fs' ),
bodyParserObj = require( 'body-parser' ),
dotEnvMap = require( 'dotenv' ).config(),
exprObj = require( 'express' ),
mysqlObj = require( 'mysql2' ),
pathObj = require( 'path' ),
serveIdxObj = require( 'serve-index' ),
utilObj = require( '../js/xhi/xhi-make-util' )(),
exprAppObj = exprObj(),
// Define Paths
fqRunPath = __dirname,
fqTopPath = pathObj.dirname( __dirname ),
// ConfigMap preparation (dMap = dotEnvMap, pMap = process.env map)
dMap = dotEnvMap.error ? {} : dotEnvMap.parsed,
pMap = process.env,
// Prepare logging
// emerg > alert > crit > err > warn > notice > info > debug
logLevelKey = '_notice_',
logObj = utilObj._getLogObj_(),
logFn = logObj._logMsg_,
dotEnvStr = utilObj._safeJsonStringify_( dMap, '' ),
// Begin configMap (example values below)
configMap = {
appName : getAltFn( 'APP_NAME', 'hi_score_server' ),
dbConnectMap : {
database : getAltFn( 'DB_SELECT', 'MyDatabase' ),
host : getAltFn( 'DB_HOST', '127.0.0.1' ),
port : getAltFn( 'DB_PORT', '3306' ),
password : getAltFn( 'DB_PASSWD' ),
user : getAltFn( 'DB_USER' )
},
fqRunPath : fqRunPath,
fqTopPath : fqTopPath,
listenPort : 8080,
mySqlQueryFn : mySqlQueryFn
}
// . End configMap
;
// Set working dir and log level
process.chdir( __dirname );
logObj._setLogLevel_( logLevelKey );
// == . END MODULE SCOPE VARIABLES ====================================
// == BEGIN UTILITY METHODS ===========================================
// BEGIN utility /mySqlQueryFn/
function mySqlQueryFn( query_str, param_list, callback_fn ) {
const mysqlConnectObj = mysqlObj.createConnection( configMap.dbConnectMap );
function onSqlReturnFn ( error_data, result_data ) {
mysqlConnectObj.end();
const result_list = Array.isArray( result_data ) ? result_data : [];
callback_fn( error_data, result_list );
}
mysqlConnectObj.connect();
mysqlConnectObj.query( query_str, param_list, onSqlReturnFn );
}
// . END utility /mySqlQueryFn/
// BEGIN utility method /getAltFn/
// Purpose: Get value from process.env map || .env file, || alternate
// in that order.
function getAltFn ( key, alt_data ) {
return pMap[ key ] || dMap[ key ] || alt_data || '';
}
// . END utility method /getAltFn/
// == . END UTILITY METHODS ===========================================
// == BEGIN MIDDLEWARE ================================================
// BEGIN middleware /noCacheFn/
function noCacheFn (req, res, next_fn) {
res.header( 'Cache-Control', 'private, no-cache, no-store, must-revalidate' );
res.header( 'Expires', '-1' );
res.header( 'Pragma', 'no-cache' );
// Set header for CORS; useful with ngrok
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next_fn();
}
// . END middleware /noCacheFn/
// == . END MIDDLEWARE ================================================
// == BEGIN START HTTP SERVER =========================================
function startServerFn () {
// Configure
exprAppObj.use( bodyParserObj.json() );
exprAppObj.use( noCacheFn );
exprAppObj.use( '/', exprObj.static( fqTopPath ),
serveIdxObj( fqTopPath, { 'icons': true } )
);
// Start
logFn( '_notice_', '\n\n'
+ '=== Intercept server start sucessful =============================\n'
+ 'appName : ' + configMap.appName + '\n'
+ 'dotEnvStr : ' + dotEnvStr + '\n'
+ 'ListenPort : ' + configMap.listenPort + '\n'
+ 'UnixTimestamp : ' + utilObj._getNowMs_() + '\n'
+ '==================================================================\n\n'
);
exprAppObj.listen( configMap.listenPort );
}
// == . END START HTTP SERVER =========================================
// == BEGIN INITIALIZE ================================================
// This can be called in after other init if needed (e.g. after reading
// a module directory)
//
startServerFn( );
// == . END INITIALIZE ================================================