# node 基础知识

# nodejs 处理 get 请求

const http = require('http')
// 解析 get 请求的参数
const querystring = require('querystring')
const server = http.createServer((req, res) => {
  console.log(req.method) // GET
  const url = req.url // 获取请求的完整 url
  // 解析 querystring
  req.query = querystring.parse(url.split('?')[1])
  res.end(JSON.stringify(req.query)) // 将 querystring 返回
})
server.listen(8000)

# nodejs 处理 post 请求

const http = require('http')
const server = http.createServer((req, res) => {
  if (req.method === 'POST') {
    // 数据格式
    console.log('content-type', req.headers['content-type')
    // 接收数据
    let postData = ''
    req.on('data', chunk => {
      postdata += chunk.toString()
    })
    // 接收数据结束
    req.on('end', () => {
      console.log(postData)
      // 在这里返回,因为是异步
      res.end('hello world')
    })
  }
})
server.listen(8000)

# 设置返回的格式

const http = require('http')
const querystru=ing = require('querystring')
const server = http.createServer((req, res) => {
  const method = req.method
  const url = req.url
  const path = url.split('?')[1]
  // 设置返回格式为 JSON -- 设置返回的字符串的类型
  res.setHeader('Content-type', 'application/json')
  // 返回数据
  const resData = {
    method,
    url,
    path,
    query
  }
  // 返回
  if (method === 'GET') {
    res.end(
      JSON.stringify(resData)
    )
  }
  if (method === 'POST') {
    let postData = ''
    req.on('data', chunk => {
      postData += chunk
    })
    req.on('end', () => {
      resData.postData = postData
      res.end(
        JSON.stringify(resData)
      )
    })
  }
})

# 搭建开发环境

  • 使用 nodemon 检测文件变化,自动重启 node 服务
  • 使用 cross-env 设置环境变量,兼容 mac linux 和 windows

# 安装

首先进行安装: npm i cross-env -D npm i nodemon -D

# 配置环境

在 package.json 中添加下面的配置:

{
  "scripts": {
    "dev": "cross-env NODE_ENV=dev nodemon ./bin/www.js",
    "prd": "cross-env NODE_ENV=production nodemon ./bin/www.js"
  }
}

然后我们在代码中就可以通过 process.env.NODE_ENV 去检测我们的开发环境

// app.js
const serverHandle = (req, res) => {
  // 设置返回格式 JSON
  res.setHeader('Content-type', 'application/json');
  const resData = {
    env: process.env.NODE_ENV
  };
  // 这里可以进行处理一些请求中所需获取的参数比如 path、解析 query,处理 post data
  res.end(JSON.stringify(resData));
};
module.exports = serverHandle;

创建 server 的代码:

// www.js
const http = require('http');
const PORT = 8000;
const serverHandle = require('../app');
const server = http.createServer(serverHandle);
server.listen(PORT);

# 初始化路由

文件路径

-src

--blog.js

--user.js

// user.js

const handleUserRouter = (req, res) => {
  const method = req.method
  const url = req.url
  const path = req.path
  // 登录
  if (method === 'POST' && path === '/api/user/login') {
    return {
      msg: '登录接口'
    }
  }
}
module.exports =  handleUserROuter

然后在 app.js 中:

const handleUserRouter = require('./src/user')
const blogHandleRouter = require('./src/blog')
const serverHandle = (res, res) => {
  // 设置返回格式 JSON
  res.setHeader('Content-type', 'application/json')
  // 处理 user 路由
  const userData = handleUserRouter(req, res)
  if (userData) {
    res.end(
      JSON.stringify(userData)
    )
    return
  }
  const blogData = blogHandleRouter(req, res)
  if (blogData) {
    res.end (
      JSON.stringify(blogData)
    )
    return
  }
  // 未命中路由 返回 404
  // 设置状态码 text/plain 代表纯文本
  res.writeHead(404, {'Content-type': 'text/plain'})
  res.write("404 Not Found\n")
  res.end()
}
module.exports = serverHandle

# 定义返回数据 Model

创建返回数据格式:

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 {
  consructor(data, message) {
    super(data, message)
    this.errno = 0
  }
}

class ErrorModel extends BaseModel {
  consructor(data, message) {
    super(data, message)
    this.errno = -1
  }
}

module.exports = {
  SuccessModel,
  ErrorModel
}

# 读取文件

在 fs 模块中,所有的方法都分为同步和异步两种实现,具有 sync 后缀的方法为同步方法,不具有 sync 后缀的方法为异步方法;

const fs = require('fs')
const path = require('path')

const fullFileName = path.resolve(__dirname, 'file', 'a.json')
// 异步回调的方式
fs.readFile(fullFileName, (err, data) => {
  if (err) {
    console.error(err)
    return
  }
  // 默认读取出来格式为二进制,将他转换为字符串
  console.log(data.toString())
})

// Promise
function getFileContent(fileName) {
  return new Promise((resolve, reject) => {
    const fullNsmr = path.resolve(__dirname, 'files', fileName)
    fs.readFile(fullFileName, (err, data) => {
      if (err) {
        reject(err)
        return
      }
      resolve(
        JSON.parse(data.toString())
      )
    })
  })
}

# 处理 post 请求的数据

const getPostData = (req) => {
  return 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)
      )
    })
  })
}

# 处理请求参数

可以在请求之前处理一些 controller 中需要的参数,比如 path,解析 querystring,以及处理 post data

// app.js
const serverHandle = (req, res) => {
  // 设置返回格式 JSON
  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
  // 上面处理 post data 的函数
  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
    }
  })
};
module.exports = serverHandle;

评 论:

更新: 11/21/2020, 7:00:56 PM