// 使用 node 内置的 http 模块创建 server 服务
const http = require('http')
const port = 2333
// 定义服务端实现的接口信息列表
const apiList = {
'/api/getUserInfo': {
method: 'get',
data: {
code: 0,
data: {
personId: '1024',
personName: 'Tom'
},
msg: '收到了你的请求,这是一段响应的文本内容'
}
}
}
// 获取请求参数
const getRequestParams = (request, callback, paramsStr) => {
let params = paramsStr ? {} : ''
// get 请求的参数是拼接在 url 后面的
if (paramsStr) {
paramsStr.split('&').forEach(item => { // 遍历封装
const [key, value] = item.split('=')
params[key] = value
})
callback(params)
return
}
// post 请求的入参需要通过下面的方式获取到,通过拼接转换 buffer 数据流实现
request.on('data', chunk => {
params += chunk
})
request.on('end', () => {
params = JSON.parse(params)
callback(params)
})
}
// 自动关闭服务器的定时器
let timer = null
const updateTimer = () => {
timer && clearTimeout(timer)
timer = setTimeout(() => {
console.log('自动关闭服务器连接')
server.close()
timer = null
}, 10000)
}
const server = http.createServer((request, response) => {
const { url, method: reqMethod } = request
console.log('http request message: ', url, reqMethod)
const [path, paramsStr] = url.split('?') // paramsStr 只会在 get 请求下存在
const apiInfo = apiList[path]
// 封装 response 数据
const packResponse = (code = 404, apiInfo = {}, params = {}) => {
console.log('request params: ', params) // 这里拿到请求参数后可以进行后续数据查询
const data = apiInfo.data
// 响应信息
response.statusCode = code
response.setHeader('Content-Type', 'application/json')
response.end(JSON.stringify(data))
}
updateTimer()
if (apiInfo) { // 请求的 api 存在
const { method } = apiInfo
if (reqMethod === method.toUpperCase()) { // 请求的 api 对应的请求方法正确
getRequestParams(request, packResponse.bind(null, 200, apiInfo), paramsStr) // 获取请求参数
} else {
packResponse(405)
}
} else {
packResponse()
}
})
server.listen(port, () => {
console.log(`服务器运行在 http://127.0.0.1:${port}/`)
updateTimer()
})
基于 Node http 模块的简易 web server 实现
最新推荐文章于 2024-11-12 11:19:19 发布
该文章展示了如何利用Node.js内置的http模块创建一个简单的HTTP服务器,并定义了模拟的API接口来处理GET请求。它还涵盖了获取请求参数的方法,包括从URL中解析GET参数以及处理POST请求的数据流。此外,文中还提及了一个自动关闭服务器的定时器机制。
摘要由CSDN通过智能技术生成