NodeJS - Blog (无框架)
VSCODE
1. VSCODE crl+K+C/U 注释与反注释;ctrl +[ / ] 缩进
2. launch.json 设置启用项目
blog-1 (Src\controller . model . router 逻辑分离)
bin\www.js
const http=require('http') const PORT=3000const serverHandle=require('../app.js') const server=http.createServer(serverHandle)
server.listen(PORT)
console.log('ok')
src\controller\blog.js
const getList =(author, keyword)=>{ return [ { id:1, title:"博客A", content:"内容A", createTime:"2022-03-01", author:"zhangshan" }, { id:2, title:"博客B", content:"内容B", createTime:"2022-03-11", author:"lisi" } ]}
const getDetail =(id)=>{ return { id:1, title:"博客A", content:"内容A", createTime:"2022-03-01", author:"zhangshan" }
}
const newBlog = (blogData={}) =>{ // blogData 是一个博客对象 console.log('new blog data ',blogData) return { id: 3 } }
const updateBlog =(id, blogData = {} ) =>{ // blogData 是一个博客对象 // id 是更新的Id console.log('update blog data ', id, blogData) return true }
const delBlog =(id) =>{ // blogData 是一个博客对象 // id 是更新的Id console.log('delete blog data ', id) return true }
module.exports = { getList, getDetail, newBlog, updateBlog, delBlog
}
src\controller\blog.js
const loginCheck = (username,password) =>{ if (username=== 'zhangshan' && password === '123' ) { return true } return false}
module.exports = loginCheck src\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.errorno=0 } }
class ErrorModel extends BaseModel{ constructor(data,message) { super(data,message) this.errorno=-1 } } module.exports={ SuccessModel, ErrorModel } src\router\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 keyword = req.query.keyword || '' const author = req.query.author || '' const data = getList(author,keyword)
// return { // msg: 'this is list for blog' // } return new SuccessModel(data) }
// 获取博客详情 if (method === 'GET' && req.path === '/api/blog/detail'){ // return { // msg: 'this is detail info for one blog' // } const data = getDetail(id) return new SuccessModel(data) }
// 新建博客 if (method === 'POST' && req.path === '/api/blog/new'){ const data=newBlog(req.body) return new SuccessModel(data) }
// 更新博客 if (method === 'POST' && req.path === '/api/blog/update'){ // return { // msg: 'update blog' // } const result = updateBlog(id,req.body) if (result) { return new SuccessModel('更新成功!') } else{ return new ErrorModel('更新博客失败!') } }
// 删除博客 if (method === 'POST' && req.path === '/api/blog/del'){ // return { // msg: 'Delete a blog' // } const result=delBlog(id) if (result) { return new SuccessModel('删除成功!') } else{ return new ErrorModel('删除博客失败!') } } }
module.exports = handleBlogRouter src\router\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 if (loginCheck(username,password)) { return new SuccessModel('登陆成功') } else{ return new ErrorModel('登录失败!') } }
}
module.exports = handleUserRouter app.js
const { resolve } = require('path') const querystring = require('querystring') const handleBlogRouter = require('./src/router/blog.js') const handleUserRouter = require('./src/router/user.js')
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)=>{ // **** 设置返回格式为jason res.setHeader('content-type','application/json')
const url = req.url req.path = url.split('?')[0]
// **** 解析Query req.query = querystring.parse(url.split('?')[1]) // **** 处理postData getPostData(req).then(postData=>{ req.body=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 }
//***未命中路由 */ res.writeHead(404,{"content-type":"text/plain"}) res.write("404 not found\n") res.end()
})
}
module.exports=serverHandle package.json { "name": "blog-1", "version": "1.0.0", "description": "", "main": "bin/www.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" } ******************* 上述未连数据库 ****************** https://dev.mysql.com/download/mysql https://dev.mysql.com/download/workbench npm install mysql --save --registry=https://registry.npm.taobao.org