From 8c49bfc93c2f4f53aa3929b21d6f0144323fa007 Mon Sep 17 00:00:00 2001 From: Luk Lu Date: Wed, 5 Aug 2020 14:27:36 +0800 Subject: [PATCH] =?UTF-8?q?npm=20i=20=E6=97=B6=E7=BC=BA=E5=B0=91=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E6=97=A0=E6=B3=95=E5=AE=89=E8=A3=85=E4=BA=86=EF=BC=8C?= =?UTF-8?q?=E6=89=80=E4=BB=A5=E5=88=A0=E9=99=A4=20greenlock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .prettierrc.js | 16 +++++ package.json | 1 - server.js | 188 +++++++++++++++++++++++++++++++------------------ 3 files changed, 135 insertions(+), 70 deletions(-) create mode 100644 .prettierrc.js diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..e001ecd --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,16 @@ +/* +对 VSCode Prettier 有效;建议一直要有本配置文件,否则不同版本的 Prettier 的默认配置会不同,例如 TrailingComma +对 VSCode Prettier Standard 无效,似乎是集成了不能修改的配置。 +*/ +module.exports = { + printWidth: 160, // default 80 + tabWidth: 2, // default 2 + useTabs: false, + semi: false, // default true + singleQuote: true, // default false + trailingComma: 'es5', // none (default in v 1.*), es5 (default in v2.0.0), all + bracketSpacing: true, // default true + jsxBracketSameLine: false, // default false + arrowParens: 'always', // avoid (default in v1.9.0), always (default since v2.0.0) + quoteProps: 'as-needed', // as-needed (default), consistent, preserve +} diff --git a/package.json b/package.json index 529dcf8..7a13570 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ "deepmerge": "^2.1.1", "errorhandler": "^1.5.0", "express": "^4.16.2", - "greenlock-express": "^4.0.3", "method-override": "^2.3.10", "morgan": "^1.9.0", "multer": "^1.4.2", diff --git a/server.js b/server.js index e873d15..1a95122 100644 --- a/server.js +++ b/server.js @@ -1,7 +1,8 @@ const fs = require('fs') const path = require('path') -const Config = Object.assign({ +const Config = Object.assign( + { // 最基础的必须的默认配置,如果用户什么也没有提供 protocol: 'http', host: 'localhost', @@ -12,60 +13,72 @@ const Config = Object.assign({ { webroot: 'dist', webindex: 'index.html', domainList: ['']} ], */ - }, + }, require('so.base/Config.js') ) -if (typeof(Config.ssl)==='string') { +if (typeof Config.ssl === 'string') { Config.ssl = eval(`(${Config.ssl})`) } -(function serve(){ +;(function serve() { console.log('★★★★★★★★ Starting Server ★★★★★★★★') - + const express = require('express') const server = express() const webToken = require('so.base/Webtoken') - const greenlock = (Config.ssl && Config.ssl.type==='greenlock') - ? require('greenlock-express').create(Object.assign(Config.ssl.greenlockOptions, {app: server})) - : null /*** 通用中间件 ***/ - server.use(require('morgan')('development'===server.get('env')?'dev':'combined')) + server.use(require('morgan')('development' === server.get('env') ? 'dev' : 'combined')) server.use(require('body-parser').json()) server.use(require('body-parser').urlencoded({ extended: false })) server.use(require('cookie-parser')()) server.use(require('compression')()) - const Multer=require('multer') - server.use(Multer({ - //dest:'./File/', // 这样,不能自定义文件名。 - storage:Multer.diskStorage({ - destination: function (req, file, cb) { // 如果直接提供字符串,Multer会负责创建该目录。如果提供函数,你要负责确保该目录存在。 - let folder = './upload/' // 目录是相对于本应用的入口js的,即相对于 server.js 的位置。 - cb(null, folder) - }, - filename: function (req, file, cb) { // 注意,req.body 也许还没有信息,因为这取决于客户端发送body和file的顺序。 - let ext = file.originalname.replace(/^.*\.(\w+)$/,'$1') - let _passtokenSource = webToken.verifyToken(req.headers._passtoken, Config.tokenKey) || {} - let filename = `${req.path.replace(/^\/api\d*/, '')}_${_passtokenSource.uuid}_${Date.now()}.${ext}` - cb(null, filename) - } - }), - //fileFilter:function(req, file, cb) {}, - limits:{fileSize:10485760} - }).single('file')) + const Multer = require('multer') + server.use( + Multer({ + //dest:'./File/', // 这样,不能自定义文件名。 + storage: Multer.diskStorage({ + destination: function (req, file, cb) { + // 如果直接提供字符串,Multer会负责创建该目录。如果提供函数,你要负责确保该目录存在。 + let folder = './upload/' // 目录是相对于本应用的入口js的,即相对于 server.js 的位置。 + cb(null, folder) + }, + filename: function (req, file, cb) { + // 注意,req.body 也许还没有信息,因为这取决于客户端发送body和file的顺序。 + let ext = file.originalname.replace(/^.*\.(\w+)$/, '$1') + let _passtokenSource = webToken.verifyToken(req.headers._passtoken, Config.tokenKey) || {} + let filename = `${req.path.replace(/^\/api\d*/, '')}_${_passtokenSource.uuid}_${Date.now()}.${ext}` + cb(null, filename) + }, + }), + //fileFilter:function(req, file, cb) {}, + limits: { fileSize: 10485760 }, + }).single('file') + ) /*** 路由 ***/ // vhost 匹配了域名,就执行;不匹配,就next() // express.static 找到了具体文件,就返回;找不到,就next() // 所以,如果 vhost匹配了域名,且static找到了文件,就结束了。如果 vhost 匹配了域名,但static找不到文件,就继续往下。 if (!Config.vhosts) { - server.use(express.static(path.join(process.cwd(), Config.from), {index: 'index.html'})) - // server.use(require('serve-favicon')(path.join(process.cwd(), 'public', 'favicon.ico'))) // uncomment after placing your favicon in /public + server.use( + express.static(path.join(process.cwd(), Config.from), { + index: 'index.html', + }) + ) + // server.use(require('serve-favicon')(path.join(process.cwd(), 'public', 'favicon.ico'))) // uncomment after placing your favicon in /public } else { let vhost = require('vhost') for (let h of Config.vhosts) { for (let domain of h.domainList) { - server.use(vhost(domain, express.static(path.join(process.cwd(), h.webroot), {index: h.webindex}))) + server.use( + vhost( + domain, + express.static(path.join(process.cwd(), h.webroot), { + index: h.webindex, + }) + ) + ) } } } @@ -81,53 +94,90 @@ if (typeof(Config.ssl)==='string') { let portHttp = Config.port || 80 let portHttps = Config.port || 443 if ('http' === Config.protocol) { - webServer = require('http').createServer(server).listen(portHttp, function (err) { - if (err) console.log(err) - else console.log(`[${new Date().toJSON()}] Server listening on ${Config.protocol}://${Config.host}:${portHttp} with IPv4=${ipv4} for ${server.settings.env} environment`) - }) + webServer = require('http') + .createServer(server) + .listen(portHttp, function (err) { + if (err) console.log(err) + else + console.log( + `[${new Date().toJSON()}] Server listening on ${Config.protocol}://${Config.host}:${portHttp} with IPv4=${ipv4} for ${ + server.settings.env + } environment` + ) + }) } else if ('https' === Config.protocol) { - webServer = require('https').createServer(Config.ssl.type === 'greenlock' ? greenlock.httpsOptions : { - key: fs.readFileSync(Config.ssl.file.key), - cert: fs.readFileSync(Config.ssl.file.cert), - // ca: [ fs.readFileSync(Config.ssl.file.ca) ] // 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(`[${new Date().toJSON()}] Server listening on ${Config.protocol}://${Config.host}:${portHttps} with IPv4=${ipv4} for ${server.settings.env} environment`) - }) + webServer = require('https') + .createServer( + { + key: fs.readFileSync(Config.ssl.file.key), + cert: fs.readFileSync(Config.ssl.file.cert), + // ca: [ fs.readFileSync(Config.ssl.file.ca) ] // 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( + `[${new Date().toJSON()}] Server listening on ${Config.protocol}://${Config.host}:${portHttps} with IPv4=${ipv4} for ${ + server.settings.env + } environment` + ) + }) } else if ('httpall' === Config.protocol) { portHttp = 80 - if (Config.ssl.type === 'greenlock') { - webServer = greenlock.listen(portHttp, portHttps, function (err) { + require('http') + .createServer( + server.all('*', function (ask, reply) { + reply.redirect(`https://${Config.host}:${portHttps}`) + }) + ) + .listen(portHttp, function (err) { if (err) console.log(err) - else console.log(`[${new Date().toJSON()}] Server listening on [${Config.protocol}] http=>https://${Config.host}:${portHttp}=>${portHttps} with IPv4=${ipv4} for ${server.settings.env} environment`) + else + console.log( + `[${new Date().toJSON()}] Server redirecting from [${Config.protocol}] http://${Config.host}:${portHttp} with IPv4=${ipv4} for ${ + server.settings.env + } environment` + ) }) - } else { - require('http').createServer(server.all('*', function (ask, reply) { - reply.redirect(`https://${Config.host}:${portHttps}`) - })).listen(portHttp, function(err) { + webServer = require('https') + .createServer( + { + key: fs.readFileSync(Config.ssl.file.key), + cert: fs.readFileSync(Config.ssl.file.cert), + // ca: [ fs.readFileSync(Config.ssl.file.ca) ] // 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(`[${new Date().toJSON()}] Server redirecting from [${Config.protocol}] http://${Config.host}:${portHttp} with IPv4=${ipv4} for ${server.settings.env} environment`) + else + console.log( + `[${new Date().toJSON()}] Server listening on [${Config.protocol}] https://${Config.host}:${portHttps} with IPv4=${ipv4} for ${ + server.settings.env + } environment` + ) }) - webServer = require('https').createServer({ - key: fs.readFileSync(Config.ssl.file.key), - cert: fs.readFileSync(Config.ssl.file.cert), - // ca: [ fs.readFileSync(Config.ssl.file.ca) ] // 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(`[${new Date().toJSON()}] Server listening on [${Config.protocol}] https://${Config.host}:${portHttps} with IPv4=${ipv4} for ${server.settings.env} environment`) - }) - } } else if ('http2https' === Config.protocol) { - webServer = require('http').createServer(server.all('*', function (ask, reply) { /* 错误的API调用进入这里。*/ - reply.redirect(`https://${Config.host}`) - })).listen(portHttp, function (err) { - if (err) console.log(err) - else console.log(`[${new Date().toJSON()}] Server listening on ${Config.protocol}://${Config.host}:${portHttp} with IPv4=${ipv4} for ${server.settings.env} environment`) - }) + webServer = require('http') + .createServer( + server.all('*', function (ask, reply) { + /* 错误的API调用进入这里。*/ reply.redirect(`https://${Config.host}`) + }) + ) + .listen(portHttp, function (err) { + if (err) console.log(err) + else + console.log( + `[${new Date().toJSON()}] Server listening on ${Config.protocol}://${Config.host}:${portHttp} with IPv4=${ipv4} for ${ + server.settings.env + } environment` + ) + }) } return webServer - })() // ==================== @@ -140,13 +190,13 @@ function getMyIp() { Object.keys(ifaces).forEach(function (ifname) { ifaces[ifname].forEach(function (iface) { if ('IPv4' === iface.family && iface.internal === false) { -// console.log('ip='+iface.address) - ipv4=iface.address + // console.log('ip='+iface.address) + ipv4 = iface.address } }) }) } catch (e) { - console.log('ERROR in getMyIP(): '+e.message) + console.log('ERROR in getMyIP(): ' + e.message) } return ipv4 }