yintai-company-home/service/core/router/index.cjs

120 lines
3.0 KiB
JavaScript

const logger = require('../utils/log.cjs')
const routes = require('./routes.cjs')
const httpProxy = require('http-proxy')
const proxy = httpProxy.createProxyServer({})
const fs = require('fs')
const dist = 'build'
let mime
import('mime').then((res) => {
mime = res.default
})
let proxys = require('../../../src/proxy.cjs')
const httpOk = 200
const httpBadRequest = 400
const matchProxy = (request, response) => {
const match = request.url.split('/')[1]
const proxyInfo = proxys['/' + match]
if (proxyInfo) {
delete request.headers.host
request.url = proxyInfo.rewrite(request.url)
proxy.web(request, response, {
target: proxyInfo.target,
changeOrigin: proxyInfo.changeOrigin
})
logger.info(`${request.method} ${httpOk} ${request.url}`)
return true
} else {
return null
}
}
const matchRouter = async (request, response) => {
let [url] = request.url.split('?')
let route = routes
let url_sp = url.split('/')
for (let p of url_sp) {
if (!p) {
continue
}
if (route[p]) {
route = route[p]
} else {
return false
}
}
if (typeof route === 'function') {
await route(request, response)
// response.writeHead(httpOk, { 'Content-Type': 'application/json' })
// response.end(JSON.stringify(res))
logger.info(`${request.method} ${httpOk} ${request.url}`)
return true
} else {
return false
}
}
const matchFile = async (request, response) => {
return new Promise((resolve) => {
const path = request.url.split('?')[0]
fs.readFile(dist + decodeURIComponent(path), (err, file) => {
if (!err) {
const mimetype = mime.getType(request.url)
response.writeHead(httpOk, { 'Content-Type': mimetype })
response.end(file)
// logger.info(`${request.method} ${httpOk} ${request.url}`)
resolve(true)
} else {
resolve(false)
}
})
})
}
const endIndex = async (request, response) => {
console.log(dist + '/index.html')
fs.readFile(dist + '/index.html', (err, html) => {
if (!err) {
response.writeHead(httpOk, { 'Content-type': 'text/html;charset=utf-8' })
response.end(html)
logger.info(`${request.method} ${httpOk} ${request.url}`)
}
})
}
const matchType = async (request, response) => {
const isRouter = await matchRouter(request, response)
if (isRouter) {
return
}
let isProxy = await matchProxy(request, response)
if (isProxy) {
return
}
let isFile = await matchFile(request, response)
if (isFile) {
return
}
await endIndex(request, response)
}
const httpService = async (request, response) => {
try {
await matchType(request, response)
} catch (e) {
response.writeHead(httpBadRequest, { 'Content-Type': 'application/json' })
response.end(
JSON.stringify({
code: -1,
message: String(e)
})
)
logger.info(`${request.method} ${httpBadRequest} ${request.url}`)
}
}
module.exports = {
httpService,
matchType,
matchRouter,
matchFile,
endIndex,
matchProxy,
}