详解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代码
Jan 11 Javascript
js弹出层(jQuery插件形式附带reLoad功能)
Apr 12 Javascript
jquery 循环显示div的示例代码
Oct 18 Javascript
javascript中的变量作用域以及变量提升详细介绍
Oct 24 Javascript
使用script的src实现跨域和类似ajax效果
Nov 10 Javascript
浅谈JavaScript Array对象
Dec 29 Javascript
JavaScript字符串常用类使用方法汇总
Apr 14 Javascript
详解动画插件wow.js的使用方法
Sep 13 Javascript
深入理解JavaScript 中的执行上下文和执行栈
Oct 23 Javascript
JavaScript学习笔记之图片库案例分析
Jan 08 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
Feb 26 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
Apr 10 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网站在线人数统计
2008/04/09 PHP
一致性哈希算法以及其PHP实现详细解析
2013/08/24 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
学习jquery之一
2007/04/27 Javascript
jQuery maxlength文本字数限制插件
2010/04/16 Javascript
jQuery1.6 使用方法二
2011/11/23 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
2015/01/23 Javascript
js实现带圆角的多级下拉菜单效果
2015/08/28 Javascript
深入浅析JavaScript中对事件的三种监听方式
2015/09/29 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
Javascript的比较汇总
2016/07/25 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
2016/11/25 Javascript
AngularJS页面传参的5种方式
2017/04/01 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
2018/02/05 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
简单了解JavaScript作用域
2020/07/31 Javascript
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
python实现可将字符转换成大写的tcp服务器实例
2015/04/29 Python
python编程开发之类型转换convert实例分析
2015/11/13 Python
Python编程实现及时获取新邮件的方法示例
2017/08/10 Python
python实现人脸识别代码
2017/11/08 Python
python中ASCII码字符与int之间的转换方法
2018/07/09 Python
在windows下使用python进行串口通讯的方法
2019/07/02 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
使用python接受tgam的脑波数据实例
2020/04/09 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
通过实例了解python__slots__使用方法
2020/09/14 Python
泰国第一的化妆品网站:Konvy
2018/02/25 全球购物
会计电算化专业毕业生求职信范文
2013/12/10 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
三八节祝酒词
2015/08/11 职场文书
用JS创建一个录屏功能
2021/11/11 Javascript
Go gorilla securecookie库的安装使用详解
2022/08/14 Golang