惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Jina AI
Jina AI
博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
美团技术团队
腾讯CDC
博客园 - Franky
MyScale Blog
MyScale Blog
人人都是产品经理
人人都是产品经理
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
aimingoo的专栏
aimingoo的专栏
博客园_首页
V
V2EX
Martin Fowler
Martin Fowler
T
The Blog of Author Tim Ferriss

博客园 - 坐看云起

强制卸载 Visual studio 2017 Pycharm 增加 run 控制台缓冲行数 HTML5中使用图片传递密文 Ubuntu 各版本代号简介 Ubuntu Desktop 15.10 自带桌面共享问题修复 Zend Studio 中导出 PHP 语法颜色配置 webkit中获取用户选择文本和编程设定选择文本 [转]为什么不能打断程序员? 儿子不背乘法口诀肿么办 大家都可以拖动的web小方块——Node.js摸石头系列之七 实现使用Websocket通讯的聊天室——Node.js摸石头系列之六 WebSocket 一场Web 通讯革命悄然来临——Node.js摸石头系列之五 完成静态服务器——Node.js摸石头系列之四 Node.js摸石头系列目录 架一个HTTP服务——Node.js摸石头系列之二 Node.js 的安装和控制台命令——Node.js摸石头系列之一 BookMarklet:瑞士军刀你用了吗? Aptana studio 3 修改配色方案 推荐引擎与学习
完成HelloWorld——Node.js摸石头系列三
坐看云起 · 2011-12-21 · via 博客园 - 坐看云起

系列目录:Node.js摸石头系列目录

一、完成HelloWorld

    上回我们说到,使用 node.js ,我们可以迅速架起一个 http 服务器。不过上次咱们仅仅是在后台看到了客户端发来了访问,还没把  “Hello World” 给发出去呢。好,说干就干。

    大家都明白,我们的Web应用抽象起来就是客户端发出请求,请求到达服务器后,服务器经过一番捣鼓,给客户端发回一个应答。“请求”我们一般抽象成 request,“应答”是 response。服务器和客户端(一般也就是浏览器啦,但是绝不局限于浏览器哦。)之间交流的语言就是 HTTP 协议了。至于服务器怎么折腾出一个应答来的,就八仙过海,各显神通了。

    总之,Web 应用中两个重量级的东东就是: Request , Response 。

    前面我们说到,每次有访问进来,我们的代码都会跑一遍。现在的问题是,在我们的代码里,怎么抓到客户端发来的 request , 然后,到哪里去找这个 response ,好把我们捣鼓出来的东西放进去,发给客户端呢?答案是,只要我们把他们作为参数交给 tellme 函数(你可以给这个函数取任何名字甚至不给他名字),然后,当请求到达时,node.js 就会把客户的请求封装成 request ,预备发给客户的应答封装成 response 。我们拿到 request ,看看他请求些什么,再折腾些东西(读出个文件也好,去查数据库也好,随便你了。)丢进 response ,发给客户端。

提醒:这种利用参数进行传递是 node.js 的常态。

请看代码:

/* Request and Response */

var http = require('http');

http.createServer(

function(request, //客户端发来的请求,node.js 帮我们封装成 request 对象
		 response //我们利用response,向客户端发送回答
		 ){
	//在控制台显示request对象
	console.log(request);
	//总算完成 hello world 了。
	response.end('Hello world!');

}).listen(888);

console.log('Server start at 888');

运行他,用浏览器访问他。现在,在浏览器得到了咱们盼望已久的“Hello world!”,真不容易啊。再看看服务器的控制台,这么一大串的是什么?这个就是 Request 了。如果您熟悉 Json 格式,我想您已经看明白了,不熟悉也没关系,其实很简单,无非就是花括号( {} )标示对象,对象里各个属性用逗号( , )隔开,每个属性都由一个“键”和一个“值”组成,中间用冒号 ( : )分开,是不是很简单呢。

{ socket:{ ... },
  ...
  headers:   { host: 'localhost:888',
     connection: 'keep-alive',
     'cache-control': 'max-age=0',
     'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1 CoolNovoChromePlus/1.6.4.30',
     accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
     'accept-encoding': 'gzip,deflate,sdch',
     'accept-language': 'zh-CN,zh;q=0.8',
     'accept-charset': 'GBK,utf-8;q=0.7,*;q=0.3' },

  ...
   url:'/',
   method:'GET',
   ...
}

    观察 request 对象,我们可以找到一些我们熟悉的东西。比如:request.url、request.method、比如 headers 。好,下面我们来把后台让我们眼花缭乱的输出简化一下:

/* Request and Response */

var http = require('http');
http.createServer(
function(request,  response ){
	//只显示request对象的某几个属性
	console.log(request.url);
	console.log(request.headers['user-agent']);
	//回应客户端
	response.end('Hello world!');
}).listen(888);

console.log('Server start at 888');

    重启服务,访问服务器,观察后台。发现我们每刷新一次浏览器,其实进来了两个request,一个是访问’/’的,另一个是找 ‘favicon.ico ' 的,当然,很抱歉,目前还没有这个网站图标给他。控制台还显示了客户端用来访问服务器的浏览器的类型和版本。如果还想知道些什么,自己去 request 里面去挖吧。

系列四我们将完成一个静态的 Web 服务器,只要把静态页面丢进某个文件夹,就可以用浏览器访问。另由于昨天去考驾照理论课,进度有些慢了,对不住。