路由(二)

接上文。

获取前端参数作出相应返回给前端

现在,前端已经可以通过修改路由访问不同的页面了,访问的页面不同调用的api也不同,作为后端的我们如何通过路由接收前端传递的参数呢?在解决这个问题之前呢,要考虑一点,路由表要和api接口文件要放在一起吗?不放在一起的话后端api接口是需要获取路由参数的,放在一起呢,工功能有不同。基于此我们做出以下处理:

​ 将所有的api接口写成一个对象,将所有的路由也写成一个对象,并将它们暴露出来并采用Object.assign()方法将其合并成一个新对象,这样是不是就解决了以上的问题呢?

那我们先改造一下server.js文件:

const http = require('http')
const fs = require('fs')
const routeTwo = require('./router.js')
const api = require("./api.js")
const Router = {}
// 可以将路由和api合并作为一个公共方法
Object.assign(Router, routeTwo) //合并对象,如果觉得还是不够简洁,可以把合并的这几行代码再封装一下
Object.assign(Router, api)
const server = http.createServer()

server.on('request', (req, res) => {
  const myUrl = new URL(req.url, "http://10.45.129.66")
  try {
    Router[myUrl.pathname](req, res)
  } catch (err) {
    Router[myUrl.pathname](req, res)
  }


}).listen(10086, () => {
  console.log("10086")
})

好啦,接下来就看要怎么传递和获取参数了呢,先把前端的事情做完,完成login登录页面:

<!--
 * @Author: 梅子黄时雨
 * @Date: 2023-02-09 09:45:12
 * @LastEditTime: 2023-02-09 15:36:00
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \node\路由\static\login.html
 -->
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

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

</script>

</html>

我们将api接口放入api.js文件并在其中做相应的处理给前端返回数据,

function render(res, data, type = "") {
  // console.log(res, data, type)
  res.writeHead(200, { "Content-Type": `${type};chartset=utf8` })
  res.write(data)
  res.end()
  // console.log(res)
}

const apiRouter = {
  '/api/login': (req, res) => {
    const myUrl = new URL(req.url, 'http://10.45.129.66')
    if (myUrl.searchParams.get('username') === "0002936" && myUrl.searchParams.get("password") === "2222") {
      render(res, '{ "name": "llibai" }', 'application/json')
    } else {
      render(res, '{ "name": "hanxin" }', 'application/json')
    }

  },
  '/api/loginPost': (req, res) => {
    let post = ""
    // 如果post数据量比较大,需要多次返回
    req.on("data", chunk => {
      post += chunk
    })
    req.on("end", () => {
      post = JSON.parse(post)
      render(res, '{ "name": "libai" }', 'application/json')
    })
  }
}
module.exports = apiRouter

启动一下服务器,访问http://localhost:10086/login
点击登录运行,看一下结果吧~
在这里插入图片描述

在这里插入图片描述
可以顺利返回数据,并且在前端也是可以正常打印的~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值