From c48e40f43c7a4379b3d65979d921c9f7978a4595 Mon Sep 17 00:00:00 2001 From: Luk Lu Date: Mon, 13 Jun 2022 07:51:18 +0800 Subject: [PATCH] rename envar.Base_Version to envar.basendVersion --- server.js | 221 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 145 insertions(+), 76 deletions(-) diff --git a/server.js b/server.js index 360cf11..e65a1a8 100644 --- a/server.js +++ b/server.js @@ -1,46 +1,68 @@ const fs = require('fs') const path = require('path') -function config() { +function config () { const commander = require('commander') const deepmerge = require('deepmerge') var Config = {} // 读取配置文件 -try { - if (fs.existsSync('./envar-base-basic.js')) { - Config=require('./envar-base-basic.js') - console.info('envar-base-basic.js loaded') + try { + if (fs.existsSync('./envar-base-basic.js')) { + Config = require('./envar-base-basic.js') + console.info('envar-base-basic.js loaded') + } + if (fs.existsSync('./envar-base-custom.js')) { + // 如果存在,覆盖掉 envar-base-basic.js 里的默认参数 + Config = deepmerge(Config, require('./envar-base-custom.js')) // 注意,objectMerge后,产生了一个新的对象,而不是在原来的Config里添加 + console.info('envar-base-custom.js loaded') + } + if (fs.existsSync('./envar-base-secret.js')) { + // 如果存在,覆盖掉 envar-base-basic.js 和 envar-base-custom.js 里的参数 + Config = deepmerge(Config, require('./envar-base-secret.js')) + console.info('envar-base-secret.js loaded') + } + } catch (err) { + console.error('Loading config files failed: ' + err.message) } - if (fs.existsSync('./envar-base-custom.js')) { // 如果存在,覆盖掉 envar-base-basic.js 里的默认参数 - Config=deepmerge(Config, require('./envar-base-custom.js')) // 注意,objectMerge后,产生了一个新的对象,而不是在原来的Config里添加 - console.info('envar-base-custom.js loaded') - } - if (fs.existsSync('./envar-base-secret.js')) { // 如果存在,覆盖掉 envar-base-basic.js 和 envar-base-custom.js 里的参数 - Config=deepmerge(Config, require('./envar-base-secret.js')) - console.info('envar-base-secret.js loaded') - } -}catch(err){ - console.error('Loading config files failed: '+err.message) -} // 载入命令行参数 commander - .version(Config.Base_Version, '-v, --version') // 默认是 -V。如果要 -v,就要加 '-v --version' - .option('-H, --host ', 'Host ip or domain name. Default to ' + Config.host) - .option('-P, --protocol ', 'Web server protocol http|https|httpall|http2https. Default to ' + Config.protocol) - .option('-p, --port ', `Server port. Default to ${Config.port?Config.port:'80|443'}`) - .option('--sslCert ', 'SSL cert file. Default to ' + Config.sslCert) - .option('--sslKey ', 'SSL privkey file. Default to ' + Config.sslKey) - .option('--sslCA ', 'SSL ca bundle file') - .option('--sslType ', `SSL provider type. Default to ${Config.sslType}`) - .parse(process.argv) + .version(Config.basendVersion, '-v, --version') // 默认是 -V。如果要 -v,就要加 '-v --version' + .option( + '-H, --host ', + 'Host ip or domain name. Default to ' + Config.host + ) + .option( + '-P, --protocol ', + 'Web server protocol http|https|httpall|http2https. Default to ' + + Config.protocol + ) + .option( + '-p, --port ', + `Server port. Default to ${Config.port ? Config.port : '80|443'}` + ) + .option('--sslCert ', 'SSL cert file. Default to ' + Config.sslCert) + .option('--sslKey ', 'SSL privkey file. Default to ' + Config.sslKey) + .option('--sslCA ', 'SSL ca bundle file') + .option( + '--sslType ', + `SSL provider type. Default to ${Config.sslType}` + ) + .parse(process.argv) // 把命令行参数 合并入配置。 Config.host = commander.host || Config.host Config.protocol = commander.protocol || Config.protocol // 默认同时启用 http 和 https - Config.port = parseInt(commander.port) || parseInt(Config.port) || (Config.protocol==='http'?80:Config.protocol==='https'?443:undefined) // 端口默认为 http:80, https:443, httpall: 80|443 + Config.port = + parseInt(commander.port) || + parseInt(Config.port) || + (Config.protocol === 'http' + ? 80 + : Config.protocol === 'https' + ? 443 + : undefined) // 端口默认为 http:80, https:443, httpall: 80|443 Config.sslCert = commander.sslCert || Config.sslCert Config.sslKey = commander.sslKey || Config.sslKey Config.sslCA = commander.sslCA || Config.sslCA @@ -51,12 +73,13 @@ try { return Config } -async function init() { /*** 设置全局对象 ***/ +async function init () { + /*** 设置全局对象 ***/ global.wo = {} // wo 代表 world或‘我’,是当前的命名空间,把各种类都放在这里,防止和其他库的冲突。 wo.Config = config() // 依次载入系统默认配置、用户配置文件、命令行参数 } -(async function start() { +;(async function start () { await init() const express = require('express') @@ -67,77 +90,123 @@ async function init() { /*** 设置全局对象 ***/ const server = express() - const greenlock = (wo.Config.sslType === 'greenlock') ? require('greenlock-express').create({ - version: 'draft-11', - server: 'https://acme-v02.api.letsencrypt.org/directory', // for test: acme-staging-v02 - agreeTos: true, - communityMember: false, - store: require('greenlock-store-fs'), - email: 'ssl@faronear.org', - approvedDomains: wo.Config.sslDomainList, - configDir: path.resolve(__dirname, 'ssl'), - app: server, - }) : null + const greenlock = + wo.Config.sslType === 'greenlock' + ? require('greenlock-express').create({ + version: 'draft-11', + server: 'https://acme-v02.api.letsencrypt.org/directory', // for test: acme-staging-v02 + agreeTos: true, + communityMember: false, + store: require('greenlock-store-fs'), + email: 'ssl@faronear.org', + approvedDomains: wo.Config.sslDomainList, + configDir: path.resolve(__dirname, 'ssl'), + app: server + }) + : null /*** 通用中间件 ***/ - server.use(logger('development'===server.get('env')?'dev':'combined')) + server.use(logger('development' === server.get('env') ? 'dev' : 'combined')) server.use(bodyParser.json()) server.use(bodyParser.urlencoded({ extended: false })) server.use(cookieParser()) server.use(compression()) /*** 路由 ***/ - server.use(express.static(path.join(__dirname, 'dist'), {index: 'index.html'})) + server.use( + express.static(path.join(__dirname, 'dist'), { index: 'index.html' }) + ) //server.use(require('serve-favicon')(path.join(__dirname, 'public', 'favicon.ico'))) // uncomment after placing your favicon in /public /*** 启动 Web 服务 ***/ let webServer if ('http' === wo.Config.protocol) { - webServer = require('http').createServer(server).listen(wo.Config.port, function(err) { - if (err) console.log(err) - else console.log(`Server listening on ${wo.Config.protocol}://${wo.Config.host}:${wo.Config.port} for ${server.settings.env} environment`) - }) + webServer = require('http') + .createServer(server) + .listen(wo.Config.port, function (err) { + if (err) console.log(err) + else + console.log( + `Server listening on ${wo.Config.protocol}://${wo.Config.host}:${wo.Config.port} for ${server.settings.env} environment` + ) + }) } else if ('https' === wo.Config.protocol) { - webServer = require('https').createServer(wo.Config.sslType === 'greenlock' ? greenlock.httpsOptions : { - key: fs.readFileSync(wo.Config.sslKey), - cert: fs.readFileSync(wo.Config.sslCert), - // ca: [ fs.readFileSync(wo.Config.sslCA) ] // only for self-signed certificate: https://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener - }, server).listen(wo.Config.port, function (err) { - if (err) console.log(err) - else console.log(`Server listening on ${wo.Config.protocol}://${wo.Config.host}:${wo.Config.port} for ${server.settings.env} environment`) - }) + webServer = require('https') + .createServer( + wo.Config.sslType === 'greenlock' + ? greenlock.httpsOptions + : { + key: fs.readFileSync(wo.Config.sslKey), + cert: fs.readFileSync(wo.Config.sslCert) + // ca: [ fs.readFileSync(wo.Config.sslCA) ] // only for self-signed certificate: https://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener + }, + server + ) + .listen(wo.Config.port, function (err) { + if (err) console.log(err) + else + console.log( + `Server listening on ${wo.Config.protocol}://${wo.Config.host}:${wo.Config.port} for ${server.settings.env} environment` + ) + }) } else if ('httpall' === wo.Config.protocol) { let portHttp = wo.Config.port ? wo.Config.port : 80 // 如果port参数已设置,使用它;否则默认为80 - let portHttps = (wo.Config.port && wo.Config.port !== 80) ? wo.Config.port + 443 : 443 // 如果port参数已设置,使用它+443;否则默认为443 + let portHttps = + wo.Config.port && wo.Config.port !== 80 ? wo.Config.port + 443 : 443 // 如果port参数已设置,使用它+443;否则默认为443 if (wo.Config.sslType === 'greenlock') { webServer = greenlock.listen(portHttp, portHttps, function (err) { if (err) console.log(err) - else console.log(`Server listening on [${wo.Config.protocol}] http=>https://${wo.Config.host}:${portHttp}=>${portHttps} for ${server.settings.env} environment`) + else + console.log( + `Server listening on [${wo.Config.protocol}] http=>https://${wo.Config.host}:${portHttp}=>${portHttps} for ${server.settings.env} environment` + ) }) } else { - require('http').createServer(server.all('*', function (ask, reply) { - reply.redirect(`https://${wo.Config.host}:${portHttps}`) - })).listen(portHttp, function(err) { - if (err) console.log(err) - else console.log(`Server listening on [${wo.Config.protocol}] http://${wo.Config.host}:${portHttp} for ${server.settings.env} environment`) - }) - webServer = require('https').createServer({ - key: fs.readFileSync(wo.Config.sslKey), - cert: fs.readFileSync(wo.Config.sslCert), - // ca: [ fs.readFileSync(wo.Config.sslCA) ] // only for self-signed certificate: https://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener - }, server).listen(portHttps, function (err) { - if (err) console.log(err) - else console.log(`Server listening on [${wo.Config.protocol}] https://${wo.Config.host}:${portHttps} for ${server.settings.env} environment`) - }) + require('http') + .createServer( + server.all('*', function (ask, reply) { + reply.redirect(`https://${wo.Config.host}:${portHttps}`) + }) + ) + .listen(portHttp, function (err) { + if (err) console.log(err) + else + console.log( + `Server listening on [${wo.Config.protocol}] http://${wo.Config.host}:${portHttp} for ${server.settings.env} environment` + ) + }) + webServer = require('https') + .createServer( + { + key: fs.readFileSync(wo.Config.sslKey), + cert: fs.readFileSync(wo.Config.sslCert) + // ca: [ fs.readFileSync(wo.Config.sslCA) ] // only for self-signed certificate: https://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener + }, + server + ) + .listen(portHttps, function (err) { + if (err) console.log(err) + else + console.log( + `Server listening on [${wo.Config.protocol}] https://${wo.Config.host}:${portHttps} for ${server.settings.env} environment` + ) + }) } } else if ('http2https' === wo.Config.protocol) { wo.Config.port = wo.Config.port || 80 - webServer = require('http').createServer(server.all('*', function(ask, reply) { /* 错误的API调用进入这里。*/ - reply.redirect(`https://${wo.Config.host}`) - })).listen(wo.Config.port, function(err) { - if (err) console.log(err) - else console.log(`Server listening on ${wo.Config.protocol}://${wo.Config.host}:${wo.Config.port} for ${server.settings.env} environment`) - }) + webServer = require('http') + .createServer( + server.all('*', function (ask, reply) { + /* 错误的API调用进入这里。*/ + reply.redirect(`https://${wo.Config.host}`) + }) + ) + .listen(wo.Config.port, function (err) { + if (err) console.log(err) + else + console.log( + `Server listening on ${wo.Config.protocol}://${wo.Config.host}:${wo.Config.port} for ${server.settings.env} environment` + ) + }) } - })()