将路由和业务分离
创建 model 进行数据返回格式的统一
resModel.js
class BaseModel {
constructor(data, message) {
if (typeof data === 'string') {
this.message = data
data = null
message = null
}
if (data) {
this.data = data
}
if (message) {
this.message = message
}
}
}
class SuccessModel extends BaseModel {
constructor(data, message) {
super(data, message)
this.errno = 0
}
}
class ErrorModel extends BaseModel {
constructor(data, message) {
super(data, message)
this.errno = -1
}
}
module.exports = {
SuccessModel,
ErrorModel
}
创建controller 实现 业务逻辑
blog.js
const getList = (author, keyword) => {
//先返回假数据 (格式正确的)
return [
{
id: 1,
title: '标题A',
content: '内容A',
createTime: 1567252730941,
author: 'zhangsan'
},
{
id: 2,
title: '标题B',
content: '内容B',
createTime: 1567252730941,
author: 'zhangsan'
},
{
id: 3,
title: '标题C',
content: '内容C',
createTime: 1567252730941,
author: 'zhangsan'
}
]
}
const getDetail = (id) => {
return {
id: 1,
title: '标题A',
content: '内容A',
createTime: 1567252730941,
author: 'zhangsan'
}
}
const newBlog = (blogData = {}) => {
//blogData 是一个博客对象,包含title ,content ,属性
return {
id: 3 //表示 新建博客 插入到数据里的id
}
}
const updateBlog = (id, blogData = {}) => {
return true
}
const delBlog = (id) => {
return true
}
module.exports = {
getList,
getDetail,
newBlog,
updateBlog,
delBlog
}
user.js
const loginCheck = (username, password) => {
if (username === 'zhangsan' && password === '123') {
return true
}
return false
}
module.exports = {
loginCheck
}
路由模块修改
blog.js
const { getList, getDetail, newBlog, updateBlog, delBlog } = require('../controller/blog')
const { SuccessModel, ErrorModel } = require('../model/resModel')
const handleBlogRouter = (req, res) => {
const method = req.method
const id = req.query.id
//获取博客列表
if (method === 'GET' && req.path === '/api/blog/list') {
const author = req.query.author || ''
const keyword = req.query.keyword || ''
const listData = getList(author, keyword)
return new SuccessModel(listData)
}
//获取博客详情
if (method === 'GET' && req.path === '/api/blog/detail') {
const data = getDetail(id)
return new SuccessModel(data)
}
//新建一篇博客
if (method === 'POST' && req.path === '/api/blog/new') {
const blogData = req.body
const data = newBlog(blogData)
return new SuccessModel(data)
}
//更新一篇博客
if (method === 'POST' && req.path === '/api/blog/update') {
const result = updateBlog(id, req.body)
if (result) {
return new SuccessModel('更新成功')
} else {
return new ErrorModel('更新失败')
}
}
//删除一篇博客
if (method === 'POST' && req.path === '/api/blog/del') {
const result = delBlog(id);
if (result) {
return new SuccessModel('删除成功')
} else {
return new ErrorModel('删除失败')
}
}
}
module.exports = handleBlogRouter
user.js
const { loginCheck } = require('../controller/user')
const { SuccessModel, ErrorModel } = require('../model/resModel')
const handleUserRouter = (req, res) => {
const method = req.method
//登录
if (method === 'POST' && req.path === '/api/user/login') {
const { username, password } = req.body
const result = loginCheck(username, password)
if (result) {
return new SuccessModel('登录成功')
}
return new ErrorModel('登录失败')
}
}
module.exports = handleUserRouter
处理 post data
const querystring = require('querystring')
const handleBlogRouter = require('./src/router/blog')
const handleUserRouter = require('./src/router/user')
//用于处理 post data
const getPostData = (req) => {
const promise = new Promise((resolve, reject) => {
if (req.method !== 'POST') {
resolve({})
return
}
if (req.headers['content-type'] !== 'application/json') {
resolve({})
return
}
let postData = ''
req.on('data', chunk => {
postData += chunk.toString()
})
req.on('end', () => {
if (!postData) {
resolve({})
return
}
resolve(
JSON.parse(postData)
)
})
})
return promise
}
const serverHandle = (req, res) => {
//设置返回格式
res.setHeader('Content-type', 'application/json')
//处理 path
const url = req.url
req.path = url.split('?')[0]
//解析 query
req.query = querystring.parse(url.split('?')[1])
//处理 post Data
getPostData(req).then(postData => {
req.body = postData
console.log(postData);
//处理blog路由
const blogData = handleBlogRouter(req, res)
if (blogData) {
res.end(JSON.stringify(blogData))
return
}
//处理user路由
const userData = handleUserRouter(req, res)
if (userData) {
res.end(JSON.stringify(userData))
return
}
// 未命中路由, 返回404
res.writeHead(404, { "Content-type": "text/plain" })
res.write("404 Not Found\n")
res.end()
})
}
module.exports = serverHandle