Files
express_router/run.js
2024-09-27 01:21:21 +08:00

96 lines
2.0 KiB
JavaScript

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