wo-base-webserver/server.js
2020-03-15 20:08:09 +08:00

129 lines
5.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const fs = require('fs')
const path = require('path')
var Config = require('so.base/config.js')
if (!Config || Object.keys(Config).length===0) {
Config = { // 默认配置,如果用户什么也没有提供
protocol: 'http',
host: 'localhost',
from: './dist', // local path to serve as webroot
// 如果使用虚拟主机
/*
vhosts: [
{ webroot: 'dist', webindex: 'index.html', domainList: ['']}
],
*/
}
}
(function serve(){
console.log('★★★★★★★★ Starting Server ★★★★★★★★')
const server = require('express')()
const greenlock = Config.sslType==='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('body-parser').json())
server.use(require('body-parser').urlencoded({ extended: false }))
server.use(require('cookie-parser')())
server.use(require('compression')())
/*** 路由 ***/
// 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
} 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})))
}
}
}
/*** 路由 ***/
//var router = express.Router()
//router.get('/path', function(req,res) { res.redirect('target') })
//server.use(router)
/*** 启动 Web 服务 ***/
let webServer
let ipv4 = getMyIp()
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`)
})
} else if ('https' === Config.protocol) {
webServer = require('https').createServer(Config.sslType === 'greenlock' ? greenlock.httpsOptions : {
key: fs.readFileSync(Config.sslKey),
cert: fs.readFileSync(Config.sslCert),
// ca: [ fs.readFileSync(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(`[${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.sslType === 'greenlock') {
webServer = greenlock.listen(portHttp, portHttps, 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 {
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 redirecting from [${Config.protocol}] http://${Config.host}:${portHttp} with IPv4=${ipv4} for ${server.settings.env} environment`)
})
webServer = require('https').createServer({
key: fs.readFileSync(Config.sslKey),
cert: fs.readFileSync(Config.sslCert),
// ca: [ fs.readFileSync(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(`[${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`)
})
}
})()
// ====================
function getMyIp() {
const os = require('os')
let ipv4 = null
try {
let ifaces = os.networkInterfaces()
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
}
})
})
} catch (e) {
console.log('ERROR in getMyIP(): '+e.message)
}
return ipv4
}