zoukankan      html  css  js  c++  java
  • 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
    ")
        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
    }
    
  • 相关阅读:
    Master公式计算递归时间复杂度
    对数器的使用
    HTML翻转菜单练习
    剑指offer题目解答合集(C++版)
    HTML---仿网易新闻登录页
    两个有序数组中的中位数以及求第k个最小数的值
    算法之重建二叉树
    AFNetWorking 上传功能使用及源码分析
    图片Alpha预乘的作用[转]
    C#/.NET 学习之路——从入门到放弃
  • 原文地址:https://www.cnblogs.com/izhaong/p/12154269.html
Copyright © 2011-2022 走看看