如何从http请求中看到是ajax请求node服务器器

& Nodejs创建HTTPS服务器
Nodejs创建HTTPS服务器
,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!
张丹(Conan), 程序员Java,R,PHP,Javascript
weibo:@Conan_Z
转载请注明出处:
互联网应用越来越多,网络安全问题应该值得大家注意起来,特别是对于有在线支付业务的网站!为保证用户的账户安全,应该使用HTTPS协议代替HTTP协议,在数据传输层保持加密。
大部分的美国网站,当涉及到个人信息时,如果不提供HTTPS的服务,多数用户都会拒绝使用的。中国的网民什么时候,才会有这种意识呢?
HTTP和HTTPS介绍
用Nodejs创建HTTPS服务器(Win7)
用Nodejs创建HTTPS服务器(Linux)
抓取请求,验证加密
1. HTTP和HTTPS介绍
HTTP: 超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
HTTPS:(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
HTTPS和HTTP的区别
https协议需要到ca申请证书,一般免费证书很少,需要交费。
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
HTTP和HTTPS的介绍,摘自
在Nodejs中,我们可以通过内置的https库,来实现HTTPS服务器。
Nodejs的HTTPS使用文档:
2. 用Nodejs创建HTTPS服务器(Win7)
win7 64bit
IP: 192.168.1.13
Nodejs:v0.10.5
Npm:1.2.19
创建express的开发环境
~ D:\workspace\javascript>express -e
nodejs-https
~ D:\workspace\javascript>cd nodejs-https && npm install
ejs@0.8.5 node_modules\ejs
express@3.2.6 node_modules\express
├── methods@0.0.1
├── fresh@0.1.0
├── cookie-signature@1.0.1
├── range-parser@0.0.4
├── debug@0.7.4
├── buffer-crc32@0.2.1
├── cookie@0.1.0
├── commander@0.6.1
├── mkdirp@0.3.4
├── send@0.1.0 (mime@1.2.6)
└── connect@2.7.11 (pause@0.0.1, qs@0.6.5, bytes@0.2.0, cookie@0.0.5, formidable@1.0.14, send@0.1.1)
我本地已经安装了,其中包括了openssl程序。
~ D:\workspace\javascript\nodejs-https>git --version
git version 1.8.1.msysgit.1
~ D:\workspace\javascript\nodejs-https>openssl version -a
OpenSSL 0.9.8e 23 Feb 2007
built on: Sat Sep 15 20:34:58 EDT 2007
platform: MSys
bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) blowfish(idx)
compiler: gcc -D_WINDLL -DOPENSSL_PIC -DOPENSSL_THREADS
-DDSO_DLFCN -DHAVE_DLFCN_H -DTERMIOS -DL_ENDIAN -D__CYGWIN__ -f
omit-frame-pointer -fnative-struct -O3 -mcpu=pentium -march=i486 -Wall -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -
DSHA1_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM
OPENSSLDIR: "/usr/ssl"
openssl生成证书文件
#生成私钥key文件:
~ D:\workspace\javascript\nodejs-https>openssl genrsa -out privatekey.pem 1024
Generating RSA private key, 1024 bit long modulus
...........................++++++
........++++++
#通过私钥生成CSR证书签名
~ D:\workspace\javascript\nodejs-https>openssl req -new -key privatekey.pem -out certrequest.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:fens.me
Organizational Unit Name (eg, section) []:fens.me
Common Name (eg, YOUR name) []:Conan Zhang
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
# 通过私钥和证书签名生成证书文件
~ D:\workspace\javascript\nodejs-https>openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem
Signature ok
subject=/C=CN/ST=Beijing/L=Beijing/O=fens.me/OU=fens.me/CN=Conan Zhang/emailAddress=
Getting Private key
新生成了3个文件:certificate.pem, certrequest.csr, privatekey.pem
~ D:\workspace\javascript\nodejs-https>ls -l
-rwx------
mkpasswd 877 Dec 14 10:53 app.js
-rwx------
mkpasswd 956 Dec 14 11:22 certificate.pem
-rwx------
mkpasswd 704 Dec 14 11:21 certrequest.csr
drwx------+ 1
0 Dec 14 11:10 node_modules
-rwx------
mkpasswd 216 Dec 14 11:03 package.json
-rwx------
mkpasswd 887 Dec 14 11:20 privatekey.pem
drwx------+ 1
0 Dec 14 10:53 public
drwx------+ 1
0 Dec 14 10:53 routes
drwx------+ 1
0 Dec 14 10:53 views
privatekey.pem: 私钥
certrequest.csr: CSR证书签名
certificate.pem: 证书文件
修改启动文件:app.js
~ vi app.js
var https = require('https')
,fs = require("fs");
var options = {
key: fs.readFileSync('./privatekey.pem'),
cert: fs.readFileSync('./certificate.pem')
https.createServer(options, app).listen(3011, function () {
console.log('Https server listening on port ' + 3011);
启动服务器:
~ D:\workspace\javascript\nodejs-https>node app.js
Express server listening on port 3000
Https server listening on port 3011
打开浏览器:HTTP访问
由于我们证书是自己创建的,没有经过第三方机构的验证,因此会出现警告的提示。大家可以去有资质的网络运营商,去申请自己的证书。比如:,优惠码:WOWfensme
这样我们就在win7完整的HTTPS服务器创建。
3. 用Nodejs创建HTTPS服务器(Linux)
创建过程与win7类似
Linux: Ubuntu 12.04.2 LTS 64bit deskop
IP: 192.168.1.20
Nodejs: npm 1.2.21
node v0.11.2
创建express项目
~ cd /home/conan/nodejs
~ express -e
nodejs-https
~ cd nodejs-https
~ sudo npm install
用openssl生成证书文件
~ openssl version -a
OpenSSL 1.0.1 14 Mar 2012
built on: Tue Jun
4 07:26:06 UTC 2013
platform: debian-amd64
bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)
compiler: cc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DOPENSSL_NO_TLS1_2_CLIENT -DOPENSSL_MAX_TLS1_2_CIPHER_LENGTH=50 -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/usr/lib/ssl"
~ openssl genrsa -out privatekey.pem 1024
~ openssl req -new -key privatekey.pem -out certrequest.csr
~ openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem
修改文件app.js
~ vi app.js
//在最下面
var https = require('https')
,fs = require("fs");
var options = {
key: fs.readFileSync('./privatekey.pem'),
cert: fs.readFileSync('./certificate.pem')
https.createServer(options, app).listen(3011, function () {
console.log('Https server listening on port ' + 3011);
启动服务器
~ node app.js
Express server listening on port 3000
Https server listening on port 3011
打开浏览器:
4. 抓取请求,验证加密
为了验证数据在传输过程中是加密的,我们用wireshark抓取网络包。
HTTP请求:http://192.168.1.20:3000/users?a=111
HTTPS请求:https://192.168.1.20:3011/users?a=112
在HTTP下面,URL请求的参数是被暴露的。在HTTPS下面,URL的请求参数是被加密的。因此,希望需要填写个人信息,及在线支付的网站,都把HTTPS服务器搭建起来。防止私密数据,在网络传输过程中被获取。
转载请注明出处:
This entry was posted in ,
Designed bynode.js+Ajax实现获取HTTP服务器返回数据
投稿:hebedich
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了node.js+Ajax实现获取HTTP服务器返回数据,讲解的十分详细,也给出了很多的实例,是篇非常不错的文章,这里推荐给大家。
我们看一个HTML5页面中通过AJAX请求的方式获取HTTP服务器返回数据的代码示例.由于我们把服务器的端口指定为1337,并将从端口为80的网站中运行HTML5页面,因此这是一种跨域操作,需要在HTTP响应头部中添加Access_Control_Allow_Origin字段,并且将参数指定为允许向服务器请求数据额域名+端口号(省略端口号时允许该域名下的任何端口向服务器请求数据),
静态页面:index.html(注:一定要放在服务器环境下,如果是win7系统的话,可以开启IIS服务,并把页面考过去直接运行这个页面,)
&!DOCTYPE html&
&head lang="en"&
&&& &meta charset="UTF-8"&
&&& &title&node中的ajax请求(html5页面)&/title&
&&& &script type="text/javascript"&
&&&&&&& function GetData(){
&&&&&&&&&&& var xhr=new XMLHttpRequest();
&&&&&&&&&&& xhr.open("GET",");
&&&&&&&&&&& xhr.onreadystatechange=function(){
&&&&&&&&&&&&&&& if(xhr.readyState==4){
&&&&&&&&&&&&&&&&&&& if(xhr.status==200){
&&&&&&&&&&&&&&&&&&&&&&& document.getElementById("res").innerHTML=xhr.responseT
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& xhr.send(null);
&&& &/script&
&input type="button" value="获取数据" onclick="GetData()" /&
&div id="res"&dsdf&/div&
var http=require("http");
var server=http.createServer(function(req,res){
&&& if(req.url!=="/favicon.ico"){
&&&&&&& res.writeHead(200,{"Content-Type":"text/plain","Access-Control-Allow-Origin":""});
&&&&&&& res.write("你好啊!");
&&& res.end();
server.listen(1337,"localhost",function(){
&&& console.log("开始监听...");
首先开启服务:node server.js
启动静态页面:
点击按钮"获取数据"
如果大家觉得需要配置服务器环境太麻烦,可以借用编辑器的优势来做.
比如我用的是webstrom 8.0;
当我启动页面的时候,浏览器中显示的是这个路径:
端口是63342.这个时候我们队代码做一些修改:
node的 server.js代码:
var http=require("http");
var server=http.createServer(function(req,res){
&&& if(req.url!=="/favicon.ico"){
&&&&&&& res.writeHead(200,{"Content-Type":"text/plain","Access-Control-Allow-Origin":""});
&&&&&&& //res.setHeader();
&&&&&&& res.write("你好啊!");
&&& res.end();
server.listen(1337,"localhost",function(){
&&& console.log("开始监听...");
修改了"Access-Control-Allow-Origin"的值.
重新运行demo会发现,达到同样的效果
也可以通过res.seetHeader来单独设置响应头部.
可以将上面的res.writeHead()改成res.setHeader();
var http=require("http");
var server=http.createServer(function(req,res){
&&& if(req.url!=="/favicon.ico"){
&&&&&&& //res.writeHead(200,{"Content-Type":"text/plain","Access-Control-Allow-Origin":""});
&&&&&&& res.setHeader("Content-Type","text/plain");
&&&&&&& res.setHeader("Access-Control-Allow-Origin","");
&&&&&&& res.write("你好啊!");
&&& res.end();
server.listen(1337,"localhost",function(){
&&& console.log("开始监听...");
细心的同学可能发现了,利用setHeader的方法时,缺少了一个状态码,比如200.那么我们在使用res.setHeader的时候,如何来设置状态码呢?等会上代码
ajax在服务器端返回的时候日期:
我们可以在服务器端返回时,删除这个字段.
设置res.sendData=
var http=require("http");
var server=http.createServer(function(req,res){
&&& if(req.url!=="/favicon.ico"){
&&&&&&& //res.writeHead(200,{"Content-Type":"text/plain","Access-Control-Allow-Origin":""});
&&&&&&& res.statusCode=200;
&&&&&&& res.sendDate=
&&&&&&& res.setHeader("Content-Type","text/plain");
&&&&&&& res.setHeader("Access-Control-Allow-Origin","");
&&&&&&& res.write("你好啊!");
&&& res.end();
server.listen(1337,"localhost",function(){
&&& console.log("开始监听...");
设置了状态码,也屏蔽了日期信息.
res.getHeader(name)获取我们设置的响应头信息
res.removeHeader(name);删除我们的头信息.必须在我们的write方法发送数据之情被调用.
res.headersSent属性是一个布尔值,当当响应头已发送时,属性值为true时;当响应头未发送时,属性值为false.
server.js代码:
var http=require("http");
var server=http.createServer(function(req,res){
&&& if(req.url!=="/favicon.ico"){
&&&&&&& if(res.headersSent)
&&&&&&&&&&& console.log("响应头已发送");
&&&&&&& else
&&&&&&&&&&& console.log("响应头未发送");
&&&&&&& res.writeHead(200,{"Content-Type":"text/plain","Access-Control-Allow-Origin":""});
&&&&&&& if(res.headersSent)
&&&&&&&&&&& console.log("响应头已发送");
&&&&&&& else
&&&&&&&&&&& console.log("响应头未发送");&&&&&&&
&&&&&&& res.write("你好啊!");
&&& res.end();
server.listen(1337,"localhost",function(){
&&& console.log("开始监听...");
运行demo查看结果:
res.write()方法是向客户端发送数据的,其实他还有一个返回值.
当向客户端发送的数据量比较小时或网速较快时,node总是将数据直接发送到操作系统的内核缓存区中,然后从内核缓存区中取出数据发送给对方.这个时候write会返回true.
当网速慢或数据量较大时,http服务器并不一定会立刻把数据发送给客户端,node会把数据缓存在内存中,并在对方可以接受数据的情况下将内存中的数据通过操作系统的内核发送给对方.这时的write返回false.
可以设置test.txt的内容多少来测试结果.
一个简单的node+ajax效果就实现了.是不是很简单呢?当然,想制作更加复杂的功能的话,我们还需要进一步的学习,以后我们慢慢来更新。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Node中http模块详解(服务端篇)
时间: 02:24:51
&&&& 阅读:1007
&&&& 评论:
&&&& 收藏:0
标签:Node中的Http
Node中提供了http模块,其中封装了高效的http服务器和http客户端
http.server是一个基于事件的HTTP服务器,内部是由c++实现的,接口由JavaScript封装
http.request是一个HTTP客户端工具。用户向服务器发送数据。
下面就来分别得介绍一下http的服务端和客户端
一、HTTP服务器
http.Server实现的,它提供了一套封装级别很低的API,仅仅是流控制和简单的解析,所有的高层功能都需要通过它的接口,就像在前面的文章中创建的服务器一样是特别的简单的。
下面分别来讲一个有关http服务器的几个事件
1.http.server事件
http.server是一个基于事件的HTTP服务器,所有的请求都被封装到独立的事件当中,我们只需要对他的事件编写相应的行数就可以实现HTTP服务器的所有功能,它继承自EventEmitter,提供了以下的事件:
request:当客户端请求到来的时候,该事件被触发,提供两个参数request和response,分别是http.ServerRequest和http.ServerResponse表示请求和响应的信息。
connection:当TCP建立连接的时候,该事件被触发,提供了一个参数socket,为net.socket的实例(底层协议对象)
3. close:当服务器关闭的时候会被触发
4. 除此之外还有checkContinue、upgrade、clientError等事件
我们最常用的还是request事件,http也给这个事件提供了一个捷径:http.createServer([requestListener])
下面我们来简单的看一下两个案例:
第一个是使用request事件的:
const http = require(‘http‘);
= require(‘net‘);
const util = require(‘util‘);
console.log("dajiahao");
var server = new http.Server();
server.on(‘request‘,(req,res)=&{
console.log(req.url);
res.writeHead(200,{‘Content-Type‘:‘text/html‘});
res.write(‘hello we are family&br&‘);
res.end(‘server already end\n‘);
server.on(‘connection‘,()=&{
server.on(‘close‘,()=&{
console.log(‘server will close‘);
server.close();
server.listen(8080);
下面的案例使用http的给的捷径http.createServer制作的代码:
const http = require(‘http‘);
= require(‘net‘);
const util = require(‘util‘);
http.createServer(function(req,res){
res.writeHead(404,{‘Content-Type‘:‘text/plain‘})
res.write("we are is content");
res.end("fdsa");
}).listen(3000);
2.http.ServerRequset请求信息
我们都知道HTTP请求分为两部分:请求头和请求体,如果请求的内容少的话就直接在请求头协议完成之后立即读取,请求体可能相对较长一点,需要一定的时间传输。因此提供了三个事件用于控制请求体传输.
(1)data:当请求体数据到来时,该事件被触发,该事件一共一个参数chunk,表示接受到的数据。
(2)end:当请求体数据传输完成时,该事件被触发,此后将不会再有数据到来。
(3)close:用户当前请求结束时,该事件被触发,不同于end,如果用户强制终止了传输,也会触发close
ServerRequest的属性
客户端请求是否已经发送完成
httpVersion
HTTP协议版本,通常是1.0或1.1
HTTP请求方法,如:GET,POST
原始的请求路径
HTTP请求头
HTTP请求尾(不常见)
connection
当前HTTP连接套接字,为net.Socket的实例
connection属性的别名
client属性的别名
http.createServer(function(req,res){
console.log(req.httpVersion);
console.log(req.headers);
console.log(req.method);
res.writeHead(404,{‘Content-Type‘:‘text/plain‘})
res.write("we are is content");
res.end("fdsa");
}).listen(8080);
3.获取GET请求内容
由于GET请求直接被嵌入在路径中,URL完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET的参数,Nodejs的url模块中的parse函数提供了这个功能
const http = require(‘http‘);
= require(‘net‘);
= require(‘url‘);
const util = require(‘util‘);
http.createServer((req,res)=&{
res.write(util.inspect(url.parse(req.url,true)));
res.end(util.inspect(url.parse(req.url,false)));
}).listen(8080);
4.获得POST请求内容
POST请求的内容全部都在请求体中,http.ServerRequest并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。譬如上传文件。恶意的POST请求会大大消耗服务器的资源。所以Nodejs是不会解析请求体,当你需要的时候,需要手动来做。
简单的看一下代码:
const http = require(‘http‘);
= require(‘net‘);
= require(‘url‘);
const util = require(‘util‘);
const querystring = require(‘querystring‘);
http.createServer((req,res)=&{
var posr = ‘‘;
req.on(‘data‘,(chunk)=&{
res,on(‘end‘,()=&{
querystring.parse(post);
res.end(util.inspect(post));
5.http.ServerResponse返回客户端信息
决定了用户最终能到的结果,它是由http.Server的request事件发送的,作为第二个参数传递。一般为response或res
主要的三个函数:
response.writeHead(statusCode,[headers]):向请求的客户端发送响应头。
statusCode是HTTP的状态码,如200为成功,404未找到等。
headers是一个类似关联数组的对象,表示响应头的每个属性。
response.write(data,[encoding]) 向请求客户端发送相应内容,data是buffer或字符串,encoding为编码
response.end([data],[encoding]) 结束响应,告知用户所有发送已经完成,当所有要返回的内容发送完毕,该函数必须被调用一次,如果不调用,客户端永远处于等待状态
&&国之画&&&& &&
版权所有 京ICP备号-2
迷上了代码!电脑教程子分类Node.js的HTTP与事件初步介绍&怎么查看API(入门篇) - JavaScript当前位置:& &&&Node.js的HTTP与事件初步介绍&怎么查看API(入门Node.js的HTTP与事件初步介绍&怎么查看API(入门篇)&&网友分享于:&&浏览:169次Node.js的HTTP与事件初步介绍&如何查看API(入门篇)
Node.js的HTTP与事件初步介绍&如何查看API(入门篇)
接着第一篇来说,当然,同样约定下面简称为Node(个人认为比较标准的说法),标题用node.js主要是为了方便阅读。同样,大牛可以略过这篇文章啦!现在,主要说3个问题:(1)接着第一篇介绍完Http其他部分(2)事件模型的介绍(3)如何查看API 文档.
首先感谢下网友hellostory,修改下上一篇的程序的bug。
一、修改前一篇的程序bug
二、接着说HTTP其他部分
因为HTTP是Node的核心模块,因此,接着上一篇,把HTTP模块讲完。
1、 http.ClientRequest类。
可以看到,该类具有5个事件(实现接口的事件,暂且不说)、6个方法。那么我们从字面意思就可以看出是“客户端请求”的意思。但是我们需要了解以下几点:
该类的实例是在http.request中创建并返回的,也就是说,var req = http.request(options, function(res){});req就是该类对象。那么如何来使用这些方法和事件呢,来一段程序,就明白了。
首先,发送一个请求,请求数据:
var http=require('http');
var options = {
hostname: '',
path: '/',
method: 'POST'
var req=http.request(options,function(response){
var str='';
response.on('data',function(data){
response.on('end',function(){
console.log(str);
req.on('error', function(e) {
console.log('problem with request: ' + e.message);
req.end();
做一下简单的说明,response.on('data',function(data){});是不断的获取返回的数据,往str中添加;监听的'data'事件(在数据流中,暂时不做介绍)。response.on('end',function(){});是监听等待响应结束事件,这时,就可以取到完整的返回数据。因为,响应时,数据会分包发送。req对象监听error事件,是防止请求出错,方便打印错误信息,如果是写成REST API,那么这里可以做一个容错处理。
这段代码很简单,但是没有说5个事件(实现接口的事件,暂且不说)、6个方法。因此,举几个特征明显的例子。
req.write('name=vczero','utf8');//write(chunk, [encoding]),发送请求body的数据块。
req.abort();//加上这句,会发现problem with request: socket hang up,他的作用是终止请求那么什么情况下,终止请求呢?比如:你要获取一个登陆的access_token,你的参数不合理。我们会采取中断请求。因此,可以注释这句代码。
req.end('language=node','utf8');//end([data], [encoding])结束发送请求,如果没有发送body的任何部分,将会将数据刷到流中。如果指定了数据,该方法等同于在end()之后调用了write方法。
req.setTimeout(1,function(){ //故意把时间设置很短,触发超时事件。
console.log('请求超时!');
再来一个监听的例子:
req.on('response',function(response){
console.log('headers:'+response.headers);//获取响应头
到这里,事件监听,似乎浮出水面了!!!那就是在对象(req)设置(on)监听事件('error'),然后触发事件,调用相应的回调函数。
整段代码如下。
2、还有一个Agent类,后面再说。
三、事件模型介绍
要深入理解Node,那么,就要掌握Node核心:核心API、事件循环、异步、回调。
1、什么是事件呢?
最简单的:鼠标click,键盘key down。
那么往深里说:数据加载load,加载完毕load over。
综合成一句话:事件就是对象自身执行的某种动作,就像,response返回数据了,我就执行data动作去处理数据,触发data事件。
Node的内核是C++编写的,单线程,非阻塞的。非阻塞是因为异步和回调,避免了长I/O操作。那么基于事件模型有什么好处呢?如何好处呢?
2、Events API
首先,看一下Events类的目录结构。
从目录结构中,我们已经很清楚了Events是怎样的一个类了。在Node中,给我们提供了events.EventEmitter类,因此,有了最基础的事件功能。所有的事件都是有EventEmitter产生的。下面,来看,这个类。
var eventEmitter=require('events').EventE
* 事件:事件就是对象自身执行的某种动作,事件有了,那么,我们还需要对象。
* 因此,我们创建一个对象,继承于EventEmitter类。
var util=require('util');//加载工具类模块,尽量使用Node的继承方式,避免js原型继承。
var Upload=function(){
console.log('文件上传对象');
//util.inherits(constructor, superConstructor) 构造函数,超类(父类)构造函数
util.inherits(Upload,eventEmitter);//通过util的inherits实现继承。
var upload=new Upload();
//设置事件监听
upload.on('init',function(){
console.log('文件格式、字符集、大小判断....');
upload.on('checkOk',function(){
console.log('检测完毕....');
upload.on('over',function(){
console.log('上传成功....OK');
//触发事件
upload.emit('init');
upload.emit('checkOk');
upload.emit('over');
我们可以在触发事件的时候判断,到哪一步了,触发什么事件。on设置事件监听,emit触发事件。结果是:
整段代码为了不变形,发一张图片吧。
四、如何查看API 文档
估计大伙都会查看API文档,因为Node既包含前端的内容,又包含后端的内容,因此,简单的介绍下API文档的查阅方式。
1、要创建一个服务器,因此,进入http://nodejs.org/api/ 点击HTTP。
2、创建web服务器对象。
3、因此,点击进去看。
4、我们查找request事件和server object。
5、点击,查看request事件。
6、可以写程序了:
http.createServer(function(request,response){
//发现这里不知道怎么写
}).listen(.0.1');
console.log('服务器启动:http://localhost:3000');
7、查看response对象
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 node http 服务器 的文章

 

随机推荐