详解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 相关文章推荐
Array的push与unshift方法性能比较分析
Mar 05 Javascript
AngularJS语法详解(续)
Jan 23 Javascript
JS实现选择TextArea内文本的方法
Aug 03 Javascript
js实现浏览器倒计时跳转页面效果
Aug 12 Javascript
学习Angular中作用域需要注意的坑
Aug 17 Javascript
js判断checkbox是否选中个数的方法(超简单)
Aug 19 Javascript
微信小程序 switch组件详解及简单实例
Jan 10 Javascript
jQuery实现所有验证通过方可提交的表单验证
Nov 21 jQuery
angular 未登录状态拦截路由跳转的方法
Oct 09 Javascript
layer.open的自适应及居中及子页面标题的修改方法
Sep 05 Javascript
js实现的订阅发布者模式简单示例
Mar 14 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
May 27 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 substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
支持中文、字母、数字的PHP验证码
2015/05/04 PHP
基于PHP-FPM进程池探秘
2017/10/17 PHP
laravel实现上传图片,并且制作缩略图,按照日期存放的代码
2019/10/16 PHP
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
jQuery 标题的自动翻转实现代码
2009/10/14 Javascript
用JS实现3D球状标签云示例代码
2013/12/01 Javascript
jQuery实现鼠标经过图片预览大图效果
2014/04/10 Javascript
Javascript限制网页只能在微信内置浏览器中访问
2014/11/09 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
浅谈JS运算符&amp;&amp;和|| 及其优先级
2016/08/10 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
2016/12/02 Javascript
详解nodejs express下使用redis管理session
2017/04/24 NodeJs
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
浅谈Vue.nextTick 的实现方法
2017/10/25 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
对layui中table组件工具栏的使用详解
2019/09/19 Javascript
Vue使用NProgress的操作过程解析
2019/10/10 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
2020/01/18 Javascript
JS变量提升及函数提升实例解析
2020/09/03 Javascript
Python多进程分块读取超大文件的方法
2016/04/13 Python
python实现批量监控网站
2016/09/09 Python
python编程使用协程并发的优缺点
2018/09/20 Python
使用python模拟命令行终端的示例
2019/08/13 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
2013/07/26 面试题
设计师个人求职信范文
2014/02/02 职场文书
太太口服液广告词
2014/03/20 职场文书
奥林匹克的口号
2014/06/13 职场文书
清洁工个人工作总结
2015/03/05 职场文书
小学重阳节活动总结
2015/03/24 职场文书
Python Numpy库的超详细教程
2022/04/06 Python
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS