Node - 接收get与post参数的方式(三)

1,437 阅读4分钟

“Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine”官网的一句介绍大致是说“Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时”,简单来说就是一个能让JS运行在服务端的环境。

前言

Hi~偶又回来,继前两篇Node入门文章,相信小伙伴们对Node也有个一定的认识(几天就忘记了,你是猪吗?),不管如何今天我们继续开启Node学习之旅吧,一起继续Happy。今天讲的主题是接收客户端携带过来给服务端的参数,这算是挺重要的一步,我们将从最基础的讲起,涉及手动接收、切割、组装数据格式,也会简单的介绍一下利用一些工具包,来快速完成这方面的操作,不过基础还是要打好,多了解,没毛病。

废话不多说,直接表白

GET请求,获取其参数。

  • 手动切割、组装
const http = require('http');
const host = 'localhost';
const port = '8888';
const server = http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    console.log(req.url); //  /?type=Node&url=blog.ydydydq.cn
    let params = getUrlParameters(req.url);
    function getUrlParameters(url) {
      if (url && url.indexOf('?') !== -1) {
        let params = {};
        let urls = url.split("?")
        let arr = urls[1].split("&")
        for (var i = 0, l = arr.length; i < l; i++) {
          let a = arr[i].split("=")
          params[a[0]] = a[1]
        }
        return params
      } else {
        return false
      }
    }
    res.end(JSON.stringify(params));
});
server.listen(port, host, () => {
    console.log(`Server running at http://${host}:${port}`);
});

GET请求我们是从req.url中获取参数,但因为参数是拼接/?type=Node&url=blog.ydydydq.cn情况,一般我们更喜欢操作对象形式,所以写了个工具函数getUrlParameters来辅助。 直接启动以上服务,在浏览器中输入:http://localhost:8888/?type=Node&url=blog.ydydydq.cn 能查看到输出如下结果: 微信图片_20201027160212.png

  • 借助url模块 我们稍微修改一下代码如下:
const http = require('http');
const url = require('url');
const host = 'localhost';
const port = '8888';
const server = http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    let params = url.parse(req.url, true).query;
    res.end(JSON.stringify(params));
});
server.listen(port, host, () => {
    console.log(`Server running at http://${host}:${port}`);
});

我们依旧可以在浏览器中得到如上结果。

上一篇文章说过Node内置了很多模块,url模块也是Node的一个内置模块,它能帮助我们快速解析好参数,也有其他一些应用场景,可以去康康哈~传送门

POST请求,获取其参数。

POST 请求的内容全部的都在请求体中,http.ServerRequest 并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。比如上传文件,而很多时候我们可能并不需要理会请求体的内容,恶意的POST请求会大大消耗服务器的资源,所以 node.js 默认是不会解析请求体的,当你需要的时候,需要手动来做。

(好吧,怎么官方的话我肯定写不出的,就是抄菜鸟教程)

(大致的意思就是说:POST请求方式的参数我Node不帮你们准备好,你们自己去收集,数据会以流的方式传输过来,我Node给你们提供一些监听方法,你们自己玩去吧,不要烦我)

const http = require('http');
const host = 'localhost';
const port = '8888';
const server = http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  let params = {};
  // req.on也可以写成req.addListener
  req.on('data', function(chunk) {
    console.log(chunk); // <Buffer 7b 0a 09 74 79 70 65 3a ....
    params += chunk;
  });
  req.on('end', function() {
    res.end(params);
  });
});

server.listen(port, host, () => {
  console.log(`Server running at http://${host}:${port}`);
});

我们发送一个POST请求,并携带相关参数: 微信图片_20201027173557.png

注意:我测试POST请求所用的工具是postman,很方便发送POST请求,后续接口测试都会在这上面去测试,感兴趣的小伙伴可以自己百度一下。当然你也可以直接创建一个html页面,写个post表单提交或者用Ajax发送POST请求都是可以的。

杀青

以上就是最简单、最基础获取客户端参数的方式了,当然现在很多Node框架(express/koa)对这方面都有了一定的封装,或者是借助其他工具包来快速操作,我们不用怎么麻烦了。但是......也没有但是了,就是写着玩,爱看不看,哈哈~

微信图片_20201027151252.jpg

个人感觉自己文笔不是很好,是个比较偏实践类的人,但偶尔也羡慕那些写文写得好的大佬,也想学学大佬们写些有趣的东西。所谓的菜鸟的自我修养,就是向大佬的看齐,即使当作学习的笔记也罢,反正就是把自己知道的东西说出来而已,这是我一个写文的念头。同时也我希望自己是个能以最简洁的言语讲清一个事要点的人,所谓读书在精不在多怎么一个方式和大家见面。