博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NodeJs——(8)http.ServerRequest的过程
阅读量:5980 次
发布时间:2019-06-20

本文共 2634 字,大约阅读时间需要 8 分钟。

(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 = '' +            '' +            '
' + '' + '' + '
' + '
' + '
' + '
' + '' + ''; 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

转载地址:http://kelox.baihongyu.com/

你可能感兴趣的文章
hql中setDate和setTimeStamp的区别
查看>>
基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0...
查看>>
用VisualBrush定制复杂的按钮样式
查看>>
composer 报 zlib_decode(): data error
查看>>
在附件管理模块中增加对FTP 上传和预览的支持
查看>>
【Javascript】—— 1 方法function的高级特性
查看>>
时间的处理--与网络时间同步
查看>>
BZOJ 3668: [Noi2014]起床困难综合症【贪心】
查看>>
第六章 对象作用域与servlet事件监听器
查看>>
Delete Volume 操作 - 每天5分钟玩转 OpenStack(57)
查看>>
一分钟应对勒索病毒WannaCry
查看>>
jquery 时间运算、格式化的方法扩张
查看>>
Oracle用户profile详解
查看>>
浅谈保险业的信息安全
查看>>
网络安全的四层智能化革命
查看>>
Windows 10磁盘修复工具Chkdsk新增的命令有哪些?赶快收藏
查看>>
如何备份一个磁盘分区
查看>>
CNCC 2016 | 中科院蒋田仔教授:脑网络组对类脑计算的启示
查看>>
ie overflow无效解决办法
查看>>
bash, 交换行。
查看>>