96 lines
2.0 KiB
JavaScript
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
|