【Node.js】路由

基础使用

写法一:

js 复制代码
// server.js
const http  = require('http');
const fs = require('fs');
const route  = require('./route')
http.createServer(function (req, res) {
  const myURL = new URL(req.url, 'http://127.0.0.1')
  route(res, myURL.pathname)
  res.end()
}).listen(3000, ()=> {
  console.log("server start")
})
js 复制代码
// route.js
const fs = require('fs')
function route(res, pathname) {
  switch (pathname) {
    case '/login':
      res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' })
      res.write(fs.readFileSync('./static/login.html'), 'utf-8')
      break;
    case '/home':
      res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' })
      res.write(fs.readFileSync('./static/home.html'), 'utf-8')
      break
    default:
      res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' })
      res.write(fs.readFileSync('./static/404.html'), 'utf-8')
      break
  }
}
module.exports = route

写法二:

js 复制代码
// route.js
const fs = require('fs')

const route = {
  "/login": (res) => {
    res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' })
    res.write(fs.readFileSync('./static/login.html'), 'utf-8')
  },
  "/home": (res) => {
    res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' })
    res.write(fs.readFileSync('./static/home.html'), 'utf-8')
  },
  "/404": (res) => {
    res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' })
    res.write(fs.readFileSync('./static/404.html'), 'utf-8')
  },
  "/favicon.ico": (res) => {
    res.writeHead(200, { 'Content-Type': 'image/x-icon;charset=utf-8' })
    res.write(fs.readFileSync('./static/favicon.ico'))
  }
}
module.exports = route
js 复制代码
// server.js
const http  = require('http');
const fs = require('fs');
const route  = require('./route')
http.createServer(function (req, res) {
  const myURL = new URL(req.url, 'http://127.0.0.1')
  try {
    route[myURL.pathname](res)
  } catch (error) {
    route['/404'](res)
  }
  res.end()
}).listen(3000, ()=> {
  console.log("server start")
})

注册路由

js 复制代码
// api.js
function render(res, data, type = "") {
  res.writeHead(200, { 'Content-Type': `${type ? type : 'application/json'};charset=utf-8` })
  res.write(data)
  res.end()
}
const apiRouter = {
  'api/login':(res)=> [
    render(res, `{ok:1}`)
  ]
}
module.exports = apiRouter
js 复制代码
// route.js
const fs = require('fs')

function render(res, path, type="") {
  res.writeHead(200, { 'Content-Type': `${type?type:'text/html'};charset=utf-8` })
  res.write(fs.readFileSync(path), 'utf-8')
  res.end()
}

const route = {
  "/login": (res) => {
    render(res, './static/login.html')
  },
  "/home": (res) => {
    render(res, './static/home.html')
  },
  "/404": (res) => {
    res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' })
    res.write(fs.readFileSync('./static/404.html'), 'utf-8')
    res.end()
  },
  "/favicon.ico": (res) => {
    render(res, './static/favicon.ico', 'image/x-icon')
  }
}
module.exports = route
js 复制代码
// server.js
const http = require('http');
const Router = {}
const use = (obj) => {
  Object.assign(Router, obj)
}
const start = () => {
  http.createServer(function (req, res) {
    const myURL = new URL(req.url, 'http://127.0.0.1')
    try {
      Router[myURL.pathname](res)
    } catch (error) {
      Router['/404'](res)
    }

  }).listen(3000, () => {
    console.log("server start")
  })
}
exports.start = start
exports.use = use
js 复制代码
// index.js
const server = require('./server');
const route = require('./route');
const api = require('./api');
// 注册路由
server.use(route)
server.use(api)
server.start()

get 和 post

js 复制代码
// api.js
function render(res, data, type = "") {
  res.writeHead(200, { 'Content-Type': `${type ? type : 'application/json'};charset=utf-8` })
  res.write(data)
  res.end()
}
const apiRouter = {
  '/api/login': (req,res) => {
    const myURL = new URL(req.url, 'http:/127.0.0.1')
    if(myURL.searchParams.get('username') === 'admin' && myURL.searchParams.get('password') === '123456') {
      render(res, `{"ok":1)`)
    } else {
      render(res, `{"ok":0}`)
    }
  },
  '/api/loginpost': (req, res) => {
    let post = ''
    req.on('data', chunk => {
      post += chunk

    })
    req.on('end', () => {
      console.log(post)
      post = JSON.parse(post)
      if(post.username === 'admin' && post.password === '123456') {
        render(res, `{"ok":1}`)
      }else {
        render(res, `{"ok":0}`)
      }
    })
  }
}
module.exports = apiRouter
js 复制代码
// route.js
const fs = require('fs')

function render(res, path, type="") {
  res.writeHead(200, { 'Content-Type': `${type?type:'text/html'};charset=utf-8` })
  res.write(fs.readFileSync(path), 'utf-8')
  res.end()
}

const route = {
  "/login": (req,res) => {
    render(res, './static/login.html')
  },
  "/home": (req,res) => {
    render(res, './static/home.html')
  },
  "/404": (req,res) => {
    res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' })
    res.write(fs.readFileSync('./static/404.html'), 'utf-8')
    res.end()
  },
  "/favicon.ico": (req,res) => {
    render(res, './static/favicon.ico', 'image/x-icon')
  }
}
module.exports = route
js 复制代码
// server.js
const http = require('http');
const Router = {}
const use = (obj) => {
  Object.assign(Router, obj)
}
const start = () => {
  http.createServer(function (req, res) {
    const myURL = new URL(req.url, 'http://127.0.0.1')
    try {
      Router[myURL.pathname](req, res)
    } catch (error) {
      Router['/404'](req, res)
    }

  }).listen(3000, () => {
    console.log("server start")
  })
}
exports.start = start
exports.use = use
js 复制代码
// index.js
const server = require('./server');
const route = require('./route');
const api = require('./api');
// 注册路由
server.use(route)
server.use(api)
server.start()
html 复制代码
<!-- login.html -->
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <div>
    用户名:<input type="text" class="username">
  </div>
  <div>
    密码:<input type="password" class="password">
  </div>
  <div>
    <button class="login">登录-get</button>
    <button class="loginpost">登录-post</button>
  </div>
  <script>
    const ologin = document.querySelector('.login')
    const ologinpost = document.querySelector('.loginpost')
    const password = document.querySelector('.password')
    const username = document.querySelector('.username')
    // get 请求
    ologin.onclick = () => {
      // console.log(username.value, password.value)
      fetch(`/api/login?username=${username.value}&password=${password.value}`)
        .then(res => res.text())
        .then(res => {
          console.log(res)
        })
    }
    // post 请求
    ologinpost.onclick = () => {
      fetch('api/loginpost',{
        method: 'post',
        headers: {
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          username: username.value,
          password: password.value
        })
      }).then(res => res.text())
        .then(res=> {
          console.log(res)
        })
    }
  </script>
</body>

</html>

静态资源管理

成为静态资源文件夹static,可以直接输入类似于login.html或者login进行访问(忽略static/)。

html 复制代码
<!-- login.html -->
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="/css/login.css">
</head>

<body>
  <div>
    用户名:<input type="text" class="username">
  </div>
  <div>
    密码:<input type="password" class="password">
  </div>
  <div>
    <button class="login">登录-get</button>
    <button class="loginpost">登录-post</button>
  </div>
  <script src="/js/login.js"></script>
</body>

</html>
css 复制代码
/* login.css */
div {
  background-color: pink;
}
js 复制代码
// login.js
const ologin = document.querySelector('.login')
const ologinpost = document.querySelector('.loginpost')
const password = document.querySelector('.password')
const username = document.querySelector('.username')
// get 请求
ologin.onclick = () => {
  // console.log(username.value, password.value)
  fetch(`/api/login?username=${username.value}&password=${password.value}`)
    .then(res => res.text())
    .then(res => {
      console.log(res)
    })
}
// post 请求
ologinpost.onclick = () => {
  fetch('api/loginpost', {
    method: 'post',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      username: username.value,
      password: password.value
    })
  }).then(res => res.text())
    .then(res => {
      console.log(res)
    })
}
js 复制代码
// api.js
function render(res, data, type = "") {
  res.writeHead(200, { 'Content-Type': `${type ? type : 'application/json'};charset=utf-8` })
  res.write(data)
  res.end()
}
const apiRouter = {
  '/api/login': (req, res) => {
    const myURL = new URL(req.url, 'http:/127.0.0.1')
    if (myURL.searchParams.get('username') === 'admin' && myURL.searchParams.get('password') === '123456') {
      render(res, `{"ok":1)`)
    } else {
      render(res, `{"ok":0}`)
    }
  },
  '/api/loginpost': (req, res) => {
    let post = ''
    req.on('data', chunk => {
      post += chunk

    })
    req.on('end', () => {
      console.log(post)
      post = JSON.parse(post)
      if (post.username === 'admin' && post.password === '123456') {
        render(res, `{"ok":1}`)
      } else {
        render(res, `{"ok":0}`)
      }
    })
  }
}
module.exports = apiRouter
js 复制代码
// index.js
const server = require('./server');
const route = require('./route');
const api = require('./api');
// 注册路由
server.use(route)
server.use(api)
server.start()
js 复制代码
// route.js
const fs = require('fs')
const mime = require('mime')
const path = require('path')
function render(res, path, type = "") {
  res.writeHead(200, { 'Content-Type': `${type ? type : 'text/html'};charset=utf-8` })
  res.write(fs.readFileSync(path), 'utf-8')
  res.end()
}

const route = {
  "/login": (req, res) => {
    render(res, './static/login.html')
  },
  "/": (req, res) => {
    render(res, './static/home.html')
  },
  "/home": (req, res) => {
    render(res, './static/home.html')
  },
  "/404": (req, res) => {
    // 校验静态资源能否读取
    if(readStaticFile(req, res)) {
      return 
    }
    res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' })
    res.write(fs.readFileSync('./static/404.html'), 'utf-8')
    res.end()
  },
  // 静态资源下没有必要写该 ico 文件加载
  // "/favicon.ico": (req, res) => {
  //   render(res, './static/favicon.ico', 'image/x-icon')
  // }
}

// 静态资源管理
function readStaticFile(req, res) {
  const myURL = new URL(req.url, 'http://127.0.0.1:3000')
  // __dirname 获取当前文件夹的绝对路径  path 有以统一形式拼接路径的方法,拼接绝对路径
  const pathname = path.join(__dirname, '/static', myURL.pathname)
  if (myURL.pathname === '/') return false
  if (fs.existsSync(pathname)) {
    // 在此访问静态资源
    // mime 存在获取文件类型的方法
    // split 方法刚好截取文件类型
    render(res, pathname, mime.getType(myURL.pathname.split('.')[1]))
    return true
  } else {
    return false
  }
}
module.exports = route
js 复制代码
// server.js
const http = require('http');
const Router = {}
const use = (obj) => {
  Object.assign(Router, obj)
}
const start = () => {
  http.createServer(function (req, res) {
    const myURL = new URL(req.url, 'http://127.0.0.1')
    try {
      Router[myURL.pathname](req, res)
    } catch (error) {
      Router['/404'](req, res)
    }

  }).listen(3000, () => {
    console.log("server start")
  })
}
exports.start = start
exports.use = use
相关推荐
Rain5098 小时前
2.2 数据基础:数据库集成与 ORM(TypeORM / Prisma)
数据库·人工智能·ai·数据分析·node.js·自动化·ai编程
大家的林语冰8 小时前
npm 不忍了,正式上线“阶段式发布“的新功能,进一步对抗频繁的供应链攻击!
前端·javascript·node.js
天蓝色的鱼鱼10 小时前
Node.js 现在能直接跑 TypeScript 了,tsx 和 ts-node 还需要吗?
前端·typescript·node.js
Rain50911 小时前
2.3. 安全配置:环境变量与 API 密钥管理
前端·人工智能·后端·安全·ai·node.js·ai编程
小葛要努力12 小时前
安装nvm 管理node.js版本实现vue2和vue3项目共存
node.js·vue·nvm
weixin_571667411 天前
[解决] Node.js 安装后 命令找不到
node.js
孜孜不倦不忘初心1 天前
mac安装nvm及问题记录
前端·node.js
快乐的哈士奇1 天前
Gmail-邮件自动处理系统
node.js·自动化·excel
星空1 天前
Node.js (Express) + Vue2 Axios 前后端交互 CRUD
vue.js·node.js·express
云浪1 天前
别再让用户干等了:用 Express + SSE 实现《红楼梦》AI 问答实时输出
javascript·后端·node.js