详解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 16 Javascript
jQuery入门问答 整理的几个常见的初学者问题
Feb 22 Javascript
javascript学习笔记(十二) RegExp类型介绍
Jun 20 Javascript
jQuery实现长按按钮触发事件的方法
Feb 02 Javascript
微信小程序 loading(加载中提示框)实例
Oct 28 Javascript
解决Webpack 热部署检测不到文件变化的问题
Feb 22 Javascript
Angular开发实践之服务端渲染
Mar 29 Javascript
vue新vue-cli3环境配置和模拟json数据的实例
Sep 19 Javascript
JS执行控制之节流模式实例分析
Dec 21 Javascript
迅速了解一下ES10中Object.fromEntries的用法使用
Mar 05 Javascript
JS+CSS实现动态时钟
Feb 19 Javascript
Vue如何清空对象
Mar 03 Vue.js
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目录与文件操作
2011/12/30 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
浅谈laravel框架与thinkPHP框架的区别
2019/10/23 PHP
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
javascript中attachEvent用法实例分析
2015/05/14 Javascript
关于微信上网页图片点击全屏放大效果
2016/12/19 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
2017/03/29 Javascript
Ajax验证用户名或昵称是否已被注册
2017/04/05 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
vue.js实现的绑定class操作示例
2018/07/06 Javascript
js prototype和__proto__的关系是什么
2019/08/23 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
Python中的map、reduce和filter浅析
2014/04/26 Python
python logging类库使用例子
2014/11/22 Python
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
python ftp 按目录结构上传下载的实现代码
2018/09/12 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
Python脚本完成post接口测试的实例
2018/12/17 Python
详解django+django-celery+celery的整合实战
2019/03/19 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
Python实现中值滤波去噪方式
2019/12/18 Python
新年福利来一波之Python轻松集齐五福(demo)
2020/01/20 Python
python如何实现单链表的反转
2020/02/10 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
python简单实现9宫格图片实例
2020/09/03 Python
Python解析微信dat文件的方法
2020/11/30 Python
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
试述DBMS的主要功能
2016/11/13 面试题
地理科学专业毕业生求职信
2013/10/15 职场文书
生产车间班组长岗位职责
2014/01/06 职场文书
JVM入门之类加载与字节码技术(类加载与类的加载器)
2021/06/15 Java/Android
微软团队与 NASA 科学家和惠普企业(HPE)的工程师合作
2022/04/21 数码科技