美文网首页
借用node来走一下简单的后端流程

借用node来走一下简单的后端流程

作者: cemcoe | 来源:发表于2020-08-13 21:00 被阅读0次

少玩简书,多读书

今天来玩一玩node,作为前端不会点后端总觉得差那么点意思。

主要用 node + http + fs 来做三个东西,当用户访问 / 时我们给到用户一个服务器中的html文件。

当用户访问 /girl 时我们给到一个图片,而当用户访问 /products 时我们给到一个我们熟悉的 api 接口。

demo

这里不会使用express,Koa进行开发,一来一上来就上框架就是在耍流氓,而来,只是一个小demo,犯不上。

0. 有哪些问题

为了搞定这个东西我们需要搞明白以下这么些问题

  • 如何获取请求的相关信息

  • 如何找到用户访问的路由,这玩意存在哪里

  • 如何对请求进行响应

  • 如何将html文件回给用户

  • 响应内容支持的格式

  • 如何设置请求头

  • content-type

我们采用不断迭代的方法来实现它。

1. 使用 http 创建 server 的步骤

创建 server 我们借助的是 http 模块。

它的使用流程大致是,引入模块,调用 createServer 方法,监听 request 事件,设置监听端口。

// 1.1 导入http库文件
const http = require('http')
// 1.2 调用createServer方法
const server = http.createServer()
// 1.3 使用on方法绑定监听事件,第一个是事件名,第二个参数是回调,和addEventListener类似
server.on('request', () => {})
// 1.4 监听端口
server.listen(8080, () => {
    console.log('http://localhost:8080/')
})

2. 获取请求的相关信息

我们只能尽可能多地知道请求的相关信息,才能为用户提供更好的服务。

这里我们先要拿到用户访问的地址,即 url,让我们聚焦到上面监听 request 事件的回调函数中,我们只能知道用户的述求后才能为其提供响应。

在回调函数中可以传入 request 和 response,这两者对应请求和响应,用户的请求相关信息就存在 request 中。

这里就转换了身份,现在我们站在后端的角度来接收前端发来的请求。

明确我们需要的信息有,用户访问的 url,该信息在req中,我们需要该信息来处理后端的路由。

// 1.3 使用on方法绑定监听事件,第一个是事件名,第二个参数是回调,和addEventListener类似
server.on('request', (req, res) => {
  const url = req.url
})

是的,就是这么的简单,url 在 request 身上,直接找他要就好了。

还有经常要知道是 GET 请求还是 POST 请求也可以找这货要。这个 req 就像酒楼的小二一样知道的可多了呢。

3. html和图片等静态文件的处理

知道了用户访问的 url 后,我们就可以开始做我们的第一个东西了。

url === '/' 时,将服务器中的一个 html 文件给到用户。

响应的格式只能是字符串或二进制格式,你不能像发文件一样直接将一个 html 文件给到客户端。

你要先读取文件内容,并将读取的数据传过去,这个过程相当于你将你的 毕业论文.pdf 的内容复制到聊天框,然后以文本的格式发给了你的导师,你这种创新的思维一定会得到老师的大大夸赞。

回归正题,读文件要用到 fs 模块,来看一下具体的代码。

// 3. html等静态文件的处理,当用户请求/时返回一个html文件,这里就有问题了,如何将服务器中的文件读出来并发给前端
// 3.1 导入fs模块
const fs = require('fs')
if(url === '/') {
  // 3.2 读取html文件
  fs.readFile('./index.html', (err, data) => {
    if (err) {
      // 3.3 对读取错误的情况进行处理
      res.setHeader('Content-Type', 'text/plain; charset=utf-8')
      res.end('文件读取失败')
    } else {
      // 3.4 设置恰当的请求头Content-Type
      res.setHeader('Content-Type', 'text/html; charset=utf-8')
      res.end(data)
    }
  })
} 

图片的处理和 html 文件类似,差别是请求头的设置是不同的。

else if(url === '/girl') {
  fs.readFile('./girl.jpg', (err, data) => {
    res.setHeader('Content-Type', 'image/jpeg')
    res.end(data)
  })
} 

4. 如何将 JSON 格式的数据给到客户端

前端提到过,响应的数据只能是字符串或二进制,对象或更见严格的 JSON 格式如果要传,那要转化一下。

else if (url === '/products') {
  // 假想的数据
  const products = [
    {
      name: 'ddd',
      price: 123
    }, {
      name: 'ccc',
      price: 3455
    }
  ]

  // 响应内容只能是字符串或二进制数据
  const res_data = JSON.stringify(products)
  res.end(res_data)
} 

最后附上完整的demo代码

// 1. 如何使用http创建server
// 1.1 导入http库文件
const http = require('http')
// 1.2 调用createServer方法
const server = http.createServer()
// 1.3 使用on方法绑定监听事件,第一个是事件名,第二个参数是回调,和addEventListener类似
server.on('request', (req, res) => {
    // 2. 如何获取请求的相关信息
    // 请求路径
    // 请求方法
    // 请求参数
    // 这里就转换了身份,现在我们站在后端的角度来接收前端发来的请求
    // 明确我们需要的信息有,用户访问的url,该信息在req中,我们需要该信息来处理后端的路由
    // 2.1 请求地址url
    const url = req.url
    console.log(req.method)
    // 3. html等静态文件的处理,当用户请求/时返回一个html文件,这里就有问题了,如何将服务器中的文件读出来并发给前端
    // 3.1 导入fs模块
    const fs = require('fs')
    if (url === '/') {
        // 3.2 读取html文件
        fs.readFile('./index.html', (err, data) => {
            if (err) {
                // 3.3 对读取错误的情况进行处理
                res.setHeader('Content-Type', 'text/plain; charset=utf-8')
                res.end('文件读取失败')

            } else {
                // 3.4 设置恰当1的请求头Content-Type
                res.setHeader('Content-Type', 'text/html; charset=utf-8')
                res.end(data)
            }
        })
    } else if (url === '/girl') {
        fs.readFile('./girl.jpg', (err, data) => {
            res.setHeader('Content-Type', 'image/jpeg')
            res.end(data)
        })
    } else if (url === '/products') {
        // 4. 如何返回json
        const products = [
            {
                name: 'ddd',
                price: 123
            }, {
                name: 'ccc',
                price: 3455
            }
        ]

        // 4.1 响应内容只能是字符串或二进制数据
        const res_data = JSON.stringify(products)
        res.end(res_data)
    } else {
        res.end('404')
    }

})
// 1.4 监听端口
server.listen(8080, () => {
    console.log('http://localhost:8080/')
})

当然了,这只是一个特别简化的版本,仅供理解使用,后端不可能就这么简单,只是一个简单的理解模型,里面具体的点慢慢了解。重要的是前端和后端这种思维的转变,其实在这两者间不断转换还是蛮有意思的。

相关文章

  • 借用node来走一下简单的后端流程

    少玩简书,多读书 今天来玩一玩node,作为前端不会点后端总觉得差那么点意思。 主要用 node + http +...

  • Stripe 支付接入笔记

    后端处理部分 后端向 stripe 服务器发起请求 本文 Postman 请求,来走支付流程 请求头 Author...

  • node+yog2+swig

    node 请求的流程 1、一个URL的请求会先去请求node中间层,node中间层向后端发送请求(如果需要),最后...

  • [慕课笔记] node+mongodb建站攻略

    如何利用node+mongodb来快速搭建一个电影网站? 一:后端部分 整个网站的后端是由node.js来驱动的,...

  • Node10.15.0的安装教程

      最近在安装Vue的服务,需要使用的node,所以简单将一些node10.15.0的安装流程介绍一下。 1. 首...

  • Node10.15.0的安装教程(最新版)

      最近在安装Vue的服务,需要使用的node,所以简单将一些node10.15.0的安装流程介绍一下。 1. 首...

  • k8s openstack ccm 配置

    k8s集群内部每个node都会开启一个node port 走 ipvs adm 负载均衡器,后端ip都是node ...

  • vue+node+mongodb实现的简单TodoList

    起因 初学node,js既然也可以写后台,也可以自定义接口,身为一个小前端就一直就想利用node来做一个简单的后端...

  • nodejs+express框架搭建简单后端服务

    Node安装 由于后端服务通常部署在linux服务器上,因此简单说下linux环境下node的安装。 可以选择去官...

  • 2018-05-07

    你的专注力,决定你可以走多远,走多久,node后端,前端架构师,混合开发,多学一些是优势。

网友评论

      本文标题:借用node来走一下简单的后端流程

      本文链接:https://www.haomeiwen.com/subject/vzzbdktx.html