详解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 HashTable
Jan 22 Javascript
javascript 客户端验证上传图片的大小(兼容IE和火狐)
Aug 15 Javascript
javascript new后的constructor属性
Aug 05 Javascript
纯JAVASCRIPT图表动画插件Highcharts Examples
Apr 16 Javascript
script标签属性type与language使用选择
Dec 02 Javascript
jQuery Validate表单验证入门学习
Dec 18 Javascript
JavaScript核心语法总结(推荐)
Jun 02 Javascript
JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
Jun 21 Javascript
JavaScript中附件预览功能实现详解(推荐)
Aug 15 Javascript
Bootstrap栅格系统的使用详解
Oct 30 Javascript
详解webpack 入门与解析
Apr 09 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
Jul 22 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
德劲1102收音机的打理维修案例
2021/03/02 无线电
Windows下安装Memcached的步骤说明
2010/04/25 PHP
php实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
2014/04/09 PHP
php连接oracle数据库及查询数据的方法
2014/12/29 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
jQuery-Tools-overlay 使用介绍
2012/07/14 Javascript
JavaScript之引用类型介绍
2012/08/10 Javascript
使用js实现雪花飘落效果
2013/08/26 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
什么是JavaScript中的结果值?
2016/10/08 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
JavaScript对象拷贝与赋值操作实例分析
2018/12/10 Javascript
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
JavaScrip如果基于url实现图片下载
2020/07/03 Javascript
[04:45]上海特级锦标赛主赛事第三日TOP10
2016/03/05 DOTA
Django Admin 实现外键过滤的方法
2017/09/29 Python
python和shell获取文本内容的方法
2018/06/05 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
python连接PostgreSQL过程解析
2020/02/09 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
瑞典的玛丽小姐:Miss Mary of Sweden
2019/02/13 全球购物
有影响力的品牌之家:Our Social Collective
2019/06/08 全球购物
世界上最大的艺术社区:SAA
2020/12/30 全球购物
军训自我鉴定100字
2014/02/13 职场文书
《画杨桃》教学反思
2014/04/13 职场文书
健康家庭事迹材料
2014/05/02 职场文书
小学生五年级大队长竞选发言稿
2014/09/12 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
Python中的 No Module named ***问题及解决
2022/07/23 Python