美文网首页
利用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