1 server.js 接收请求接收请求参数 和接收完成需要对request增加两个监听事件

var http = require('http');
var url = require('url');
function start(route,handler)
{
function onRequest(request,res)
{
var postData ="";
var pathName = url.parse(request.url).pathname;
request.setEncoding("utf8");

request.addListener("data",function(postDataChunk)
{

//接收的参数累加 因为nodejs接收参数到达一定的大小会分片发过来
postData += postDataChunk;

console.log("Received POST data chunk '"+
postDataChunk +"'.");
});

request.addListener("end",function()
{

//得到全部参数后 发给路由
route(pathName,handler, res, postData);
});
}

http.createServer(onRequest).listen(5000);
console.log('Server Started');
}

exports.start = start;

2 route.js

function route(pathName,handler,res,postData)
{
console.log('router user request url:'+pathName+'\n');
if(typeof handler[pathName]==='function')
{
return handler[pathName](res,postData);
}else{
console.log('No request handler found for '+pathName);
return '404';
}
}
exports.route = route;

3 requestHandler.js

var querystring = require('querystring');
//使用 response直接输出 就不会阻塞其他请求
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.write('querystring:'+querystring.parse(postData).text);//自动解析为中文
response.end();
}

exports.start = start;
exports.upload = upload;

4 index.js

var server = require('./server');
var route = require('./route');
var requestHandlers = require('./requestHandlers');
var handle ={}
handle["/"]= requestHandlers.start;
handle["/start"]= requestHandlers.start;
handle["/upload"]= requestHandlers.upload;

server.start(route.route,handle);

//注意输出的结果

response.write("You've sent: "+ postData);//有特殊的编码
response.write('querystring:'+querystring.parse(postData).text);//自动解析为中文

第七课 nodejs请求响应的更多相关文章

  1. TCP/IP协议,,OSI的七层参考模型,HTTP请求响应机制

    一.TCP/IP协议 TCP/IP是Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是In ...

  2. HTTP协议请求响应过程和HTTPS工作原理

    HTTP协议 HTTP协议主要应用是在服务器和客户端之间,客户端接受超文本. 服务器按照一定规则,发送到客户端(一般是浏览器)的传送通信协议.与之类似的还有文件传送协议(file transfer p ...

  3. HTTP请求响应过程 与HTTPS区别

    原文:HTTP请求响应过程 与HTTPS区别 HTTP协议学习笔记,基础,干货 HTTP协议 HTTP协议主要应用是在服务器和客户端之间,客户端接受超文本. 服务器按照一定规则,发送到客户端(一般是浏 ...

  4. Asp.Net请求响应过程

    Asp.Net请求响应过程 在之前,我们写了自己的Asp.Net框架,对整个流程有了一个大概的认识.这次我们来看一下Asp.Net整个请求处理过程是怎么样的. 浏览器封装请求报文,发送请求到达服务器, ...

  5. [译]Quartz.NET 框架 教程(中文版)2.2.x 之第七课 触发监听器和作业任务监听器

    第七课:触发监听器和作业任务监听器 监听器是在调度器中基于事件机制执行操作的对象.你大概可以猜到,触发监听器接收响应跟触发器有关的事件,作业任务监听器接收响应跟作业任务有关的事件. 跟触发器有关的事件 ...

  6. 第一篇 Flask基础篇之(配置文件,路由系统,模板,请求响应,session&cookie)

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  7. Flask框架(二)—— 反向解析、配置信息、路由系统、模板、请求响应、闪现、session

    Flask框架(二)—— 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 目录 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 一.反向解析 1.什么是反向解析 ...

  8. HTTP请求响应过程以及与HTTPS区别

    HTTP协议 HTTP协议主要应用是在服务器和客户端之间,客户端接受超文本. 服务器按照一定规则,发送到客户端(一般是浏览器)的传送通信协议.与之类似的还有文件传送协议(file transfer p ...

  9. 一比一还原axios源码(二)—— 请求响应处理

    上一章,我们开发了一些简单的代码,这部分代码最最核心的一个方法就是buildURL,应对了把对象处理成query参数的方方面面.虽然我们现在可以发起简单的请求了,但是第一,我们无法接收到服务器的响应, ...

随机推荐

  1. 应用程序池和应用程序域的区别(Difference between application pool and application domain)

    来自StackOverFlow:  http://stackoverflow.com/questions/8486335/difference-between-an-application-domai ...

  2. openerp wizard to tree view

    从wizard跳转到tree视图最简单的方法   <act_window context="{'search_default_server_id': active_id, 'defau ...

  3. Ubuntu 11.04 (Natty) 已经停止支持 但可以使用old-releases源了

    Ubuntu 11.04 (Natty) 已经停止支持,但可以使用old-releases源了,先备份源列表文件: sudo cp /etc/apt/sources.list /etc/apt/sou ...

  4. iOSQuart2D绘图之UIImage简单使用

    代码地址如下:http://www.demodashi.com/demo/11609.html 人生得意须尽欢,莫使金樽空对月. 天生我材必有用,千金散尽还复来. 前记 说到UIImage大家都不会感 ...

  5. usb转串口模块下载时遇到的问题

    ch340g usb转TTL模块,烧写wifi模块ESP8266固件时,为图省事,我直接用的该模块的3.3v电为wifi模块供的电,结果刚一上电就出现串口模块消失(听到噔的一声),电脑设备管理器里就看 ...

  6. mysql分组取最大(最小、最新、前N条)条记录

    在数据库开发过程中,我们要为每种类型的数据取出前几条记录,或者是取最新.最小.最大等等,这个该如何实现呢,本文章向大家介绍如何实现mysql分组取最大(最小.最新.前N条)条记录.需要的可以参考一下. ...

  7. Python脚本性能剖析

    ################### #Python脚本性能剖析 ################### cProfile/profile/hotshot用于统计Python脚本各部分运行频率和耗费 ...

  8. MII、GMII、RMII、SGMII、XGMII

    MII即媒体独立接口,也叫介质无关接口.它是IEEE-802.3定义的以太网行业标准.它包括一个数据接口,以及一个MAC和PHY之间的管理接口(图1). 数据接口包括分别用于发送器和接收器的两条独立信 ...

  9. hdu 1829 &amp;poj 2492 A Bug&#39;s Life(推断二分图、带权并查集)

    A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  10. Mac显示和隐藏隐藏文件

    显示:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏:defaults write com.apple.finder A ...