const http = require("http"); const { URL } = require("url"); let map = new Map(); map.set("get", {}) map.set("post", {}) let port = 3000 let hostName = "127.0.0.1" let server = http.createServer() server.listen(port, hostName, () => { console.log(`app is run http://${hostName}:${port}`); }) server.get = (path, callback) => { map.get("get")[path] = callback } server.post = (path, callback) => { map.get("post")[path] = callback } server.on("request", async (req, res) => { if (req.url != "/favicon.ico") { json(res) // 请求方式转小写 req.method = req.method.toLowerCase() // 解析请求地址 req.url = new URL(req.url, `http://${req.headers.host}`) await handleReqParams(req) var pathName = req.url.pathname; if (map.get(req.method)[pathName] != undefined) { await map.get(req.method)[pathName](req, res) } else { // 如果请求不存在的话 res.end(`${req.method} methods to path: ${pathName} not found`) } } }) /** * 直接响应json数据 * @param {*} res */ const json = (res) => { res.json = (data) => res.end(JSON.stringify(data)) } /** * GET请求参数转对象 * @param {*} req */ const handleReqParams = (req) => { return new Promise((resolve, reject) => { req.query = {} req.body = {} switch (req.method) { case "get": // 如果地址后面没有参数,则处理参数 if (req.url.search.length != 0) { req.query = stringToObj(req.url.searchParams.toString()) } resolve(req) break; case "post": req.on('data', (data) => req.body = JSON.parse(data.toString())); req.on('end', () => resolve(req)) break; default: break; } }) } function stringToObj(str) { var obj = {}; var temp = str.split('&') for (var i = 0; i < temp.length; i++) { var t = temp[i].split('=') obj[t[0]] = Number.isNaN(Number(t[1])) ? decodeURIComponent(t[1]) : Number(t[1]) } return obj } module.exports = server