Node.js 从零开发 web server博客项目[接口]

web server博客项目

  1. Node.js 从零开发 web server博客项目[项目介绍]
  2. Node.js 从零开发 web server博客项目[接口]
  3. Node.js 从零开发 web server博客项目[数据存储]
  4. Node.js 从零开发 web server博客项目[登录]
  5. Node.js 从零开发 web server博客项目[日志]
  6. Node.js 从零开发 web server博客项目[安全]
  7. Node.js 从零开发 web server博客项目[express重构博客项目]
  8. Node.js 从零开发 web server博客项目[koa2重构博客项目]
  9. Node.js 从零开发 web server博客项目[上线与配置]

目录结构

    |-- app.js
    |-- package.json
    |-- bin
    |   |-- www.js
    |-- src
        |-- controller
        |   |-- blog.js
        |   |-- user.js
        |-- model
        |   |-- resModel.js
        |-- router
            |-- blog.js
            |-- user.js

package.json

{
  "name": "blog-1",
  "version": "1.0.0",
  "description": "",
  "main": "bin/www.js",
  "scripts": {
    "dev": "cross-env NODE_ENV=dev nodemon ./bin/www.js",
    "prd": "cross-env NODE_ENV=production nodemon ./bin/www.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "cross-env": "^5.2.0",
    "nodemon": "^1.19.1"
  }
}

www.js

const http = require('http')
const port = 9527

const serverHandle = require('../app')

const server = http.createServer(serverHandle)
server.listen(port, () => {
  console.log(`server is running on ${port}`)
})

app.js

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) {
        resovle({})
        return
      }
      resolve(
        JSON.parse(postData)
      )
    })
  })
  return promise
}

const serverHandle = (req, res) => {
  // 设置返回文件格式 JSON
  res.setHeader('Content-type', 'application/json')

  const url = req.url

  // 获取path  
  req.path = url.split('?')[0]

  // 解析 query
  req.query = querystring.parse(url.split('?')[1])

  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
    }

    // 未命中路由, 返回404
    res.writeHead(404, {
      "content-type": "text/plain"
    })
    res.write("404 Not Found\n")
    res.end()

  })
}


module.exports = serverHandle

// process.env.NODE_ENV

router/blog.js

const {
  getList,
  getDtail,
  newBlog,
  updateBlog,
  delBlog
} = require('../controller/blog')
const {
  SuccessModel,
  ErrorModel
} = require('../model/resModel')

const handleBlogRouter = (req, res) => {
  const {
    method,
    path
  } = req

  const id = req.query.id

  // 获取博客列表
  if (method === 'GET' && path === '/api/blog/list') {
    const {
      author,
      keyword
    } = req.query || ''
    const listData = getList(author, keyword)
    return new SuccessModel(listData)
  }

  // 获取一篇博客的内容
  if (method === 'GET' && path === '/api/blog/detail') {
    const data = getDtail(id)
    return new SuccessModel(data)
  }

  // 新增一篇博客
  if (method === 'POST' && path === '/api/blog/new') {
    const data = newBlog(req.body)
    return new SuccessModel(data)
  }

  // 更新一篇博客
  if (method === 'POST' && path === '/api/blog/update') {
    const result = updateBlog(id, req.body)
    if (result) {
      return new SuccessModel(data)
    } else {
      return ErrorModel('更新博客失败')
    }
  }

  // 删除一篇博客
  if (method === 'POST' && path === '/api/blog/del') {
    const result = delBlog(id)
    if (result) {
      return new SuccessModel(result)
    } else {
      return new ErrorModel('删除博客失败')
    }
  }
}

module.exports = handleBlogRouter

router/user.js

const {
  loginCheck
} = require('../controller/user')
const { SuccessModel, ErrorModel} = require('../model/resModel')

const handleUserRouter = (req, res) => {
  const {
    method,
    path
  } = req

  // 登录
  if (method === 'POST' && path === '/api/user/login') {
    const {
      username,
      password
    } = req.body
    const result = loginCheck(username, password)

    if (result) {
      return new SuccessModel(result)
    } else {
      return new ErrorModel('登录失败')
    }
  }
}

module.exports = handleUserRouter

假数据

controller/blog.js

const getList = (author, keyword) => {
  // 博客列表
  return [{
      id: 1,
      title: '标题a',
      content: '内容a',
      createTime: 1562085127324,
      suthor: 'zhangsan'
    },
    {
      id: 2,
      title: '标题b',
      content: '内容b',
      createTime: 1562085168425,
      suthor: 'lisi'
    },
  ]
}

// 博客内容
const getDtail = (id) => {
  return {
    id: 1,
    title: '标题a',
    content: '内容a',
    createTime: 1562085127324,
    suthor: 'zhangsan'
  }
}

// 新增一篇博客
const newBlog = (blogData) => {
  // 赋予id
  return {
    id: 3
  }
}

// 更新一篇博客
const updateBlog = (id, blogData = {}) => {
  console.log(`更新一篇博客, ID:${id}, 内容:${blogData}`)
  return true
}

// 删除一篇博客
const delBlog = (id) => {
  console.log(`删除一篇博客, ID:${id}`)
  return true
}

module.exports = {
  getList,
  getDtail,
  newBlog,
  updateBlog,
  delBlog
}

controller/user.js

const loginCheck = (username, password) => {
  if (username === 'zhangsan' && password === '1234') {
    return true
  }
}

module.exports = {
  loginCheck
}
posted @ 2019-07-03 19:37  仲灏  阅读(1143)  评论(0编辑  收藏  举报