(25)http.ServerRequest的过程

①http.ServerRequest提供了3个事件用于控制请求体传输:

【1】data:当请求体数据到来时,该事件被触发,提供一个参数给回调函数,是接受到的数据,该事件可能被多次调用(所有data按顺序的集合,是请求体数据)。如果该事件没有被监听,请求体将被抛弃;

【2】end:当请求体数据完成时该事件触发。此后不再触发data事件;

【3】close:用户当前请求结束时,该事件被触发。不同于end,如果用户强制终止了传输,也还是调用close

②获取GET请求内容

【1】GET请求被直接内嵌在路径中。URL是完整的请求路径(包括?后面的部分),因此手动解析后面的内容作为GET请求的参数。

Node.js的url模块中的parse函数提供了这个功能。

以url:http://127.0.0.1/user?name=byvoid&email=byvoid@byvoid.com为例:

先上代码:

var http = require("http");
var url = require("url");
var server = new http.Server();
server.on("request", function (req, res) {if (req.url == "/favicon.ico") {return;}var m = url.parse(req.url, true);console.log(m)res.writeHead(200, {'Content-type': 'text/html;charset = utf8'});res.end();
})
server.listen(80);
console.log("The server begin");

通过console.log返回的内容是:

Url {

protocol: null,

slashes: null,

auth: null,

host: null,

port: null,

hostname: null,

hash: null,

search:'?name=byvoid&email=byvoid@byvoid.com',

query: { name: 'byvoid', email:'byvoid@byvoid.com' },

pathname: '/user',

path:'/user?name=byvoid&email=byvoid@byvoid.com',

href:'/user?name=byvoid&email=byvoid@byvoid.com' }

其中几个关键是:

pathname是我们关心的url地址请求;而path是完整的部分

query是get方法的部分;在这里包含了name和email两个属性,他们中间用&相连接;

于是,想要获取GET请求的方法,只需要通过url的query部分即可;

③获取POST请求内容:

POST方法的请求内容,被放置在请求体之中,即之前的data、end、close相关事件;

post方法的请求体内容的解析方法是利用querystring模块的parse方法;

var http = require("http");
var querystring = require("querystring");
var server = new http.Server();
server.on("request", function (req, res) {if (req.url == "/favicon.ico") {return;}if (req.url !== "/post") {  //默认页面是这个var body = '<html>' +'<head>' +'<meta http-equiv="Content-Type" content="text/html; ' +'charset=UTF-8" />' +'</head>' +'<body>' +'<form action="/post" method="post">' +'<textarea name="text" rows="20" cols="60"></textarea>' +'<input type="submit" value="Submit text" />' +'</form>' +'</body>' +'</html>';res.writeHead(200, {'Content-type': 'text/html;charset = utf8'});res.write(body);res.end();} else {    //当提交表单后,跳转到这个页面var PostData = null; //这个变量用于存储全部数据req.on("data", function (data) {    //因为可能多次data事件,因此需要通过+=来完成PostData += data;})req.on("end", function () { //当data事件触发完毕后会触发这个事件,返回事件必须写在这里,不然PostData是空var message = querystring.parse(PostData); //进行解析,变成一个对象console.log(message); //显示这个对象res.writeHead(200, {'Content-type': 'text/html;charset = utf8'});   //返回if (PostData)res.write(message.nulltext);res.end();})}
})
server.listen(80);
console.log("The server begin");

PS:按照说明,这种方法有严重效率问题和安全隐患。因此不能在真正的生产环境中使用这种方法。

个人推测,实际使用中一般使用的都是模板,比如ejs或者jade

NodeJs——(8)http.ServerRequest的过程相关推荐

  1. nodejs异步测试_异步过程的自动化测试

    nodejs异步测试 自从我开发了具有异步行为的服务器端应用程序以来已经有一段时间了,而该行为还不是事件驱动的系统. 异步行为始终是设计和测试中一个有趣的挑战. 通常,异步行为不应该很难进行单元测试– ...

  2. nodejs+vue毕业设计论文选题过程管理系统express

    目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.2 nodejs 框架介 ...

  3. nodejs安装不好_nodejs安装过程中环境变量配置的问题

    目前总是不成功,提示module.js:471,抛出错误,无法找到模块之类的. 按照这个链接里给的方法,我查看了下路径.上面的是全局模块的安装路径,下面是全局模块的默认搜索路径. 我尝试把环境变量中用 ...

  4. 若要加载模块二进制_春哥说 | 浅谈NodeJs的模块机制-2

    ★ 目录 ★ 01 Node的模块实现概述 02 优先从缓存中加载 03 路径分析和文件定位 Node的模块实现概述 Nodejs再集成CommonJs的模块机制的规范时进行了取舍,同时增加了特性. ...

  5. Linux服务器安装NodeJs简易方法

    一开始尝试用g++编译nodejs源码来安装nodejs,但是在编译过程中非常容易出现各种各样的编译错误问题,无法解决,功亏一篑.在踩了坑后,找到了一种基本上百分百成功的安装步骤. 1.连接自己的云服 ...

  6. nodejs mysql 同步_NodeJS实现同步的方法

    NodeJS被打上了单线程.非阻塞.事件驱动-..等标签. 在单线程的情况下,是无法开启子线程的.经过了很久的研究,发现并没有thread函数!!!但是有时候,我们确实需要"多线程" ...

  7. 关于vue框架下载步骤以及过程中可能遇到的问题汇总

    1.下载各个版本的vue框架链接介绍 | vue-element-admin 2.下载方法 1.去git网站下载git,如果git已经下载并安装好,该步可以省略   2.去nodejs网站下载node ...

  8. NodeJS应用部署之PM2(充分利用多核cpu)

    前言 正文 推荐资料 附录:NodeJS学习网络资料整理 1 从零开始 – 入门篇 2 成为高手 – 进阶篇 3 追根溯源 – 内核篇 4 跨界应用 – 创造篇 5 利剑在手 – 工具篇 6 Web技 ...

  9. udp 使用connect优点_nodejs源码分析第十九章 -- udp模块

    udp不是面向连接的协议,所以使用上会比tcp简单,他和tcp一样,使用四元组来标记通信的双方(单播的情况下).我们看看udp作为服务器和客户端的时候的流程. 1 在c语言中使用udp 1.1 服务器 ...

最新文章

  1. python详细下载安装教程-Pycharm及python安装详细教程
  2. Tool之Bazel:Bazel的简介、安装、使用方法之详细攻略
  3. 【David Silver强化学习公开课】-8:Integrating Learning and Planning
  4. mapreduce的shuffle机制(来自学习笔记)
  5. 清华计算机学院吴建平,吴建平
  6. 在布局空间标注的尺寸量不对_CAD图纸中标注值和实际测量值不一样怎么回事?...
  7. 使用ExtJS做一个用户的增删改查
  8. (匹配)The Accomodation of Students --HDU --2444
  9. android拆轮子系列之一步一步教你写微信抢红包插件
  10. Iocomp Crack和ProEssentials Crack
  11. Python3,1行代码,去除图片的背景图,确实香。
  12. 在‘句子迷’爬取网友总结的方文山歌词并作词频统计
  13. ”不怎么动的运动“塑造完美翘臀
  14. contest12 CF514div2 ooxxx oooox ooooo
  15. python柱形图绘制_Python绘图之柱形图绘制详解
  16. 2022.11.16 英语背诵
  17. 【Numpy】np.stack()最通俗易懂解释
  18. 工程文件参考——CubeMX+STM32F4+FreeRTOS+IIC实现JY901通讯
  19. 关于Android中RSA数字签名的理解及使用
  20. [NOI2003] 文本编辑器

热门文章

  1. JS实现将所有超链接指向同一个页面地址
  2. Spring Boot RestTemplate 忽略证书访问https
  3. python搭建环境教程_python教程(一)·python环境搭建
  4. cx_oracle主备服务器,怎么在Python中使用cx_Oracle模块对Oracle数据库进行操作
  5. Python中的lambda表达式与filter函数
  6. MySQL中的DATE_SUB()函数和DATE_ADD()函数
  7. Java中调用FTP服务时inputStream获取一直为null
  8. 语言 micropython_【雕爷学编程】MicroPython动手做(03)——零基础学MaixPy之开机测试...
  9. python入门程序异常_Python 入门 之 异常处理
  10. ajax卡死new formdata(),使用FormData和jQuery上传Ajax大文件无法发布数据