详解Node.Js如何处理post数据


Posted in Javascript onSeptember 19, 2016

实现思路

将data和end事件的回调函数直接放在服务器中,在data事件回调中收集所有的POST数据,当接收到所有数据,触发end事件后,其回调函数调用请求路由,并将数据传递给它,然后,请求路由再将该数据传递给请求处理程序。

实现步骤

第一步我们设置了接收数据的编码格式为UTF-8,第二步注册了“data”事件的监听器,用于收集每次接收到的新数据块,并将其赋值给postData 变量,最后第三步我们将请求路由的调用移到end事件处理程序中,以确保它只会当所有数据接收完毕后才触发,并且只触发一次。我们同时还把POST数据传递给请求路由

示例代码

index.js

var server = require("./server"); 
var router=require("./router"); 
var requestHandlers=require("./requestHandlers"); 
 
var handle = {} 
handle["/"] = requestHandlers.start; 
handle["/start"] = requestHandlers.start; 
handle["/upload"] = requestHandlers.upload; 
 
server.start(router.route,handle);

server.js

var http = require("http"); 
var url=require("url"); 
 
function start(route,handle) { 
 function onRequest(request, response) { 
  var postData=""; 
    var pathname=url.parse(request.url).pathname; 
  console.log("Request for"+pathname+"received."); 
    
   request.setEncoding("utf8"); 
    
   request.addListener("data", function(postDataChunk) { 
     postData += postDataChunk; 
     console.log("Received POST data chunk '"+ 
     postDataChunk + "'."); 
  }); 
 
  request.addListener("end", function() { 
   route(handle, pathname, response, postData); 
  }); 
    //route(handle,pathname,response); 
   
  //response.writeHead(200, {"Content-Type": "text/plain"}); 
  //response.write("this is a demo"); 
  //response.end(); 
 } 
 
 http.createServer(onRequest).listen(5656,'127.0.0.1'); 
 console.log("Server has started. localhost:5656"); 
} 
 
exports.start = start;

router.js

function route(handle,pathname,response,postData){ 
  console.log("About to route a request for"+pathname); 
  if(typeof handle[pathname]=='function'){ 
    handle[pathname](response,postData); 
  } 
  else{ 
    console.log("no request handler found for"+pathname); 
    response.writeHead(404, {"Content-Type": "text/plain"}); 
  response.write("404 Not found"); 
  response.end(); 
  } 
} 
exports.route=route;

requestHandlers.js

//var querystring = require("querystring"); 
 
function start(response,postData) { 
 console.log("Request handler 'start' was called."); 
 
 var body = '<html>'+ 
  '<head>'+ 
  '<meta http-equiv="Content-Type" content="text/html; '+ 
  'charset=UTF-8" />'+ 
  '</head>'+ 
  '<body>'+ 
  '<form action="/upload" method="post">'+ 
  '<textarea name="text" rows="20" cols="60"></textarea>'+ 
  '<input type="submit" value="Submit text" />'+ 
  '</form>'+ 
  '</body>'+ 
  '</html>'; 
 
  response.writeHead(200, {"Content-Type": "text/html"}); 
  response.write(body); 
  response.end(); 
} 
 
function upload(response,postData) { 
 console.log("Request handler 'upload' was called."); 
 response.writeHead(200, {"Content-Type": "text/plain"}); 
 response.write("You've sent: " + postData); 
 response.end(); 
} 
 
exports.start = start; 
exports.upload = upload;

运行:node mynode/index

浏览器输入http://localhost:5656/

详解Node.Js如何处理post数据

结果:

详解Node.Js如何处理post数据

在文本框里输入“I LOVE YOU” 点击提交

详解Node.Js如何处理post数据

详解Node.Js如何处理post数据

使用querystring模块只提取文本,修改一下requestHandlers.js使只返回文本

var querystring = require("querystring"); 
 
function start(response,postData) { 
 console.log("Request handler 'start' was called."); 
 
 var body = '<html>'+ 
  '<head>'+ 
  '<meta http-equiv="Content-Type" content="text/html; '+ 
  'charset=UTF-8" />'+ 
  '</head>'+ 
  '<body>'+ 
  '<form action="/upload" method="post">'+ 
  '<textarea name="text" rows="20" cols="60"></textarea>'+ 
  '<input type="submit" value="Submit text" />'+ 
  '</form>'+ 
  '</body>'+ 
  '</html>'; 
 
  response.writeHead(200, {"Content-Type": "text/html"}); 
  response.write(body); 
  response.end(); 
} 
 
function upload(response,postData) { 
 console.log("Request handler 'upload' was called."); 
 response.writeHead(200, {"Content-Type": "text/plain"}); 
 response.write("You've sent: " + querystring.parse(postData).text); 
 response.end(); 
} 
 
exports.start = start; 
exports.upload = upload;

重新启动,依旧输入I LOVE YOU ,提交

详解Node.Js如何处理post数据

总结

以上就是这篇文章的全部内容了,希望这篇文章的内容对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
JavaScript进阶教程(第四课第一部分)
Apr 05 Javascript
JavaScript 数组循环引起的思考
Jan 01 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
Aug 01 Javascript
Node.js实现在目录中查找某个字符串及所在文件
Sep 03 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
Sep 04 Javascript
js与jquery分别实现tab标签页功能的方法
Nov 18 Javascript
微信小程序开发(一) 微信登录流程详解
Jan 11 Javascript
vue.js利用defineProperty实现数据的双向绑定
Apr 28 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
Jul 12 Javascript
Bootstrap图片轮播效果详解
Oct 17 Javascript
Vue基础学习之项目整合及优化
Jun 02 Javascript
微信小程序解析富文本过程详解
Jul 13 Javascript
React Native实现简单的登录功能(推荐)
Sep 19 #Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
Sep 19 #Javascript
BootStrap入门教程(二)之固定的内置样式
Sep 19 #Javascript
BootStrap入门教程(一)之可视化布局
Sep 19 #Javascript
Node.js的基本知识简单汇总
Sep 19 #Javascript
React实现双向绑定示例代码
Sep 19 #Javascript
vue从使用到源码实现教程详解
Sep 19 #Javascript
You might like
php中的时间显示
2007/01/18 PHP
关于PHP session 存储方式的详细介绍
2013/06/25 PHP
php判断数组元素中是否存在某个字符串的方法
2014/06/14 PHP
关于document.cookie的使用javascript
2010/10/29 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
网站基于flash实现的Banner图切换效果代码
2014/10/14 Javascript
scrollWidth,clientWidth,offsetWidth的区别
2015/01/13 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
2015/02/23 Javascript
jQuery制作简洁的图片轮播效果
2015/04/03 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
js仿支付宝多方框输入支付密码效果
2016/09/27 Javascript
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
VUE2.0中Jsonp的使用方法
2018/05/22 Javascript
Vue.js实现的表格增加删除demo示例
2018/05/22 Javascript
详解如何在微信小程序中愉快地使用sass
2018/07/30 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
python 调用钉钉机器人的方法
2019/02/20 Python
pandas计数 value_counts()的使用
2019/06/24 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
opencv 阈值分割的具体使用
2020/07/08 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
在html页面中取得session中的值的方法
2020/08/11 HTML / CSS
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
bonprix匈牙利:女士、男士和儿童服装
2019/07/19 全球购物
入团者的自我评价分享
2013/12/02 职场文书
一份婚庆公司创业计划书
2014/01/11 职场文书
新员工试用期自我鉴定
2014/04/17 职场文书
2014年班级工作总结范文
2014/12/23 职场文书
申报材料格式
2014/12/30 职场文书
党员转正意见怎么写
2015/06/03 职场文书