美文网首页
利用node实现get请求数据读写、处理post请求参数以及使用

利用node实现get请求数据读写、处理post请求参数以及使用

作者: 听书先生 | 来源:发表于2022-03-08 22:51 被阅读0次

    一般node中去获取拼接在url的get参数,需要利用node的内置模块中的queryString以及url这两个内置模块。

    • 获取get请求中URL路径的参数:
      get 请求的数据,是通过url路径传递过来的,通过 url.parse() 等方法来解析url路径 获取get请求的数据。
      这里有两种处理方法:
      一种是直接再去使用fs.parse()方法去解析出路径上的内容返回key-value集合
      另外一种是直接url.parse(req.url, true)处理同样能得到key-value集合
    const http = require('http');
    const url = require('url');
    const fs = require('querystring');
    
    http.createServer((req, res) => {
       /**
        * get 请求的数据, 是通过url路径传递过来的
        * 通过 url.parse 等方法来解析  url路径 获取get请求的数据
        */
       console.log(req.url);
       let { query } = url.parse(req.url, false);
       console.log(fs.parse(query));
       res.end('test')
    }).listen(3000, () => console.log('Server port at  3000 start ....'))
    
    图1.png
    • 使用包处理静态资源目录:
      手动利用node去模仿Apache的映射关系,会使得工作量非常的大,可以使用npm资源包serve-static处理静态目录的,以及finalhandler包,官网上的案例非常明显,这两个npm包是配套使用的。
      image.png

    接着,我们可以在目录下npm init -y初始化一个package.json依赖内容文件出来
    然后终端中安装这两个包npm install finalhandler serve-static
    为了方便测试,我们在public下创建两个模板文件:

    图2.png
    需要注意的是:在使用静态资源目录,要把静态资源处理放到最后,防止前面进行通配。
    const http = require('http');
    const url = require('url');
    const fs = require('querystring');
    
    // 引入处理静态资源的包
    const serveStatic = require('serve-static');
    
    const finalHandler = require('finalhandler');
    
    // 定义静态资源目录
    let serve = serveStatic('public', { 'index': ['index.html', 'index.htm']})
    
    http.createServer((req, res) => {
       /**
        * get 请求的数据, 是通过url路径传递过来的
        * 通过 url.parse 等方法来解析  url路径 获取get请求的数据
        */
       console.log(req.url);
       let { query } = url.parse(req.url, false);
       console.log(fs.parse(query));
    
       // 使用静态资源目录,要把静态资源处理,放到最后
       // 防止前面进行通配
       serve(req, res, finalHandler(req, res));
    
    
    }).listen(3000, () => console.log('Server port at  3000 start ....'))
    
    图3.png

    这样可以发现,类似apache的路径映射就实现了,没有该路径会找不到对应的模块。

    • 使用get方式实现学生数据的录入:
      利用get请求录入学生信息,实际上的思路就是通过在http://localhost:3000/addStudent端口url上去拼接学生的姓名,年龄以及学校信息后,node中利用pathname去匹配到/addStudent这个新增学生的路由,然后再利用内置的fs模块去实现数据的读写模拟接口录入。
    const http = require('http');
    const url = require('url');
    const qs = require('querystring');
    const fs = require('fs');
    
    // 引入处理静态资源的包
    const serveStatic = require('serve-static');
    
    const finalHandler = require('finalhandler');
    
    // 定义静态资源目录
    let serve = serveStatic('public', { 'index': ['index.html', 'index.htm']})
    
    http.createServer((req, res) => {
       /**
        * get 请求的数据, 是通过url路径传递过来的
        * 通过 url.parse 等方法来解析  url路径 获取get请求的数据
        */
       console.log(req.url);
       let { query, pathname } = url.parse(req.url, true);
       res.setHeader('Content-Type', 'text/html;charset=utf8')
       // 1. 匹配路由
       if (pathname === '/getStudent') {
          res.end('get')
       } else if (pathname === '/addStudent') {
          // 如果匹配到的是添加学生信息,那么分三步完成:
          // 1、获取get路径上的参数信息(也就是学生数据)并重新调整格式
          const stu_info = `
             学号: ${query.no} \n
             姓名: ${query.name} \n
             年龄: ${query.age} \n
             学校: ${query.school} \n
          `
          console.log(stu_info)
          // 2.对录入信息后 文件的路径进行拼接
          const filePath = `./public/student_db/${query.no}.txt`;
          
          // 3.调用fs内置模块进行数据的写入
          fs.writeFile(filePath, stu_info, (error, data) => {
             if (error) {
                res.end('数据录入失败...');
             } else {
                res.end('数据录入成功...')
             } 
             
          })
       } else {
          // 使用静态资源目录,要把静态资源处理,放到最后
          // 防止前面进行通配
          serve(req, res, finalHandler(req, res));
       }
    }).listen(3000, () => console.log('Server port at  3000 start ....'))
    
    图4.png
    • 利用get方式去查询学生信息:
    const http = require('http');
    const url = require('url');
    const qs = require('querystring');
    const fs = require('fs');
    
    // 引入处理静态资源的包
    const serveStatic = require('serve-static');
    
    const finalHandler = require('finalhandler');
    
    // 定义静态资源目录
    let serve = serveStatic('public', { 'index': ['index.html', 'index.htm']})
    
    http.createServer((req, res) => {
       /**
        * get 请求的数据, 是通过url路径传递过来的
        * 通过 url.parse 等方法来解析  url路径 获取get请求的数据
        */
       console.log(req.url);
       let { query, pathname } = url.parse(req.url, true);
       res.setHeader('Content-Type', 'text/html;charset=utf8')
       // 1. 匹配路由
       if (pathname === '/getStudent') {
    
          const filePath = `./public/student_db/${query.no}.txt`;
    
          fs.readFile(filePath, (error, data) => {
             if (error) {
                res.end('数据查询失败...');
             } else {
                res.end(data.toString());
             }
          })
       } else if (pathname === '/addStudent') {
          // 如果匹配到的是添加学生信息,那么分三步完成:
          // 1、获取get路径上的参数信息(也就是学生数据)并重新调整格式
          const stu_info = `
             学号: ${query.no} \n
             姓名: ${query.name} \n
             年龄: ${query.age} \n
             学校: ${query.school} \n
          `
          console.log(stu_info)
          // 2.对录入信息后 文件的路径进行拼接
          const filePath = `./public/student_db/${query.no}.txt`;
          
          // 3.调用fs内置模块进行数据的写入
          fs.writeFile(filePath, stu_info, (error, data) => {
             if (error) {
                res.end('数据录入失败...');
             } else {
                res.end('数据录入成功...')
             } 
             
          })
       } else {
          // 使用静态资源目录,要把静态资源处理,放到最后
          // 防止前面进行通配
          serve(req, res, finalHandler(req, res));
       }
    }).listen(3000, () => console.log('Server port at  3000 start ....'))
    
    图5.png
    • 使用post请求方式操作核心:
      post方式的核心就是在于获取数据流的问题,使用req.on()首先去监听数据流的变化情况,当end触发时,再去写入获取到的数据流。方法类似
    http.createServer((req, res) => {
       let info = '';
       req.on('data', (chunk) => {
          info += chunk;
       });
    
       req.on('end', () => {
          console.log('info: ', info);
       })
    }).listen(3000, () => console.log('Server port at 3000 start ....'))
    

    相关文章

      网友评论

          本文标题:利用node实现get请求数据读写、处理post请求参数以及使用

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