index.js 1.91 KB
const http = require('http')
const { APP } = require('../src/config/app')
const routes = require('./router')
const axios = require('axios')

const publicHeaders  = [
    {
        'access-control-allow-origin': '*',
        'access-control-allow-methods': '*',
        'access-control-allow-headers': '*',
        'access-control-request-headers': '*',
        'access-control-expose-headers': '*'
    }
]

const server = http.createServer(async (req, res) => {

    let payload = []
    req.on('data', chunk => payload.push(chunk))

    req.on('end', async () => {
        payload = Buffer.concat(payload).toString('utf8')
        payload = JSON.parse(payload || '{}')
        
        const index = routes.findIndex(e => new RegExp(e.url).test(req.url) && e.method.toUpperCase() === req.method.toUpperCase() )

        // 访问远程服务器
        if (index === -1) {
            const { status, headers, data } = await request({...req, data: payload})
            res.statusCode = status
            Object.keys(headers).forEach(key => res.setHeader(key, headers[key]))
            res.write(handleData(data))
            res.end()
        }
        else {
            res.statusCode = 200
            Object.keys(publicHeaders).forEach(key => res.setHeader(key, publicHeaders[key]))
            const data = routes[index].controller(req)
            res.write(handleData(data))
            res.end()
        }
    }) 
})

const request = async ({url, method, headers, data}) => {
    url = APP.baseUrl.proxy + url
    headers = {...headers}
    if (headers.host) delete headers.host

    return axios({url, method, headers, data})
                .then(res => res)
                .catch(err => Promise.resolve(err.response) )
}


const handleData = data => {
    if (typeof data === 'object') return JSON.stringify(data)
    else return data
}


server.listen(APP.baseUrl.dev.prot, APP.baseUrl.dev.host, () => {
    console.log('mock启动成功')
})