详解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 相关文章推荐
js遍历td tr等html元素
Dec 13 Javascript
jQuery控制iFrame(实例代码)
Nov 19 Javascript
jquery动态添加删除一行数据示例
Jun 12 Javascript
Javascript实现多彩雪花从天降散落效果的方法
Feb 02 Javascript
jquery操作select元素和option的实例代码
Feb 03 Javascript
使用 Node.js 模拟滑动拼图验证码操作的示例代码
Nov 02 Javascript
vuex 项目结构目录及一些简单配置介绍
Apr 08 Javascript
vue路由拦截及页面跳转的设置方法
May 24 Javascript
React 无状态组件(Stateless Component) 与高阶组件
Aug 14 Javascript
element-ui中的select下拉列表设置默认值方法
Aug 24 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
Jan 06 Javascript
微信小程序订阅消息(java后端实现)开发
Jun 01 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
Yii中表单用法实例详解
2016/01/05 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
XmlUtils JS操作XML工具类
2009/10/01 Javascript
几个比较经典常用的jQuery小技巧
2010/03/01 Javascript
JavaScript中setInterval的用法总结
2013/11/20 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
Node.js学习之TCP/IP数据通讯(实例讲解)
2017/10/11 Javascript
老生常谈JS中的继承及实现代码
2018/07/06 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
新手快速入门JavaScript装饰者模式与AOP
2019/06/24 Javascript
如何利用node转发请求详解
2020/09/17 Javascript
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
讲解Python中if语句的嵌套用法
2015/05/14 Python
详解python基础之while循环及if判断
2017/08/24 Python
python 列表,数组和矩阵sum的用法及区别介绍
2018/06/28 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
解决Django连接db遇到的问题
2019/08/29 Python
TensorFlow梯度求解tf.gradients实例
2020/02/04 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
2020/03/08 Python
python怎么提高计算速度
2020/06/11 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
屈臣氏泰国官网:Watsons TH
2021/02/23 全球购物
省级优秀毕业生主要事迹
2014/05/29 职场文书
实验心得体会
2014/09/05 职场文书
小学感恩节活动总结
2015/03/24 职场文书
企业法人任命书
2015/09/21 职场文书
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL