在 上一个实验 中,演示 Node.JS 中的事件接口。本次实验,我们将演示建立一个简单的 HTTP 服务。
建立一个最简单的HTTP服务
Node.JS 中已经自带了对 HTTP 服务的支持,只需要引入相关的 http 包即可。建立一个名为: httpServer.js 的文件。填入一下代码:
1 2 3 4 5 6 7 8 9
| var http = require('http');
http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/html'}); res.write('<h1>Node.js</h1>'); res.end('<p>Hello World</p>'); }).listen(3000);
console.log("HTTP server is listening at port 3000.");
|
从以上代码可以看到,我们使用了 http 包,并调用了包中的 createServer 方法来建立 HTTP 服务。我们使用一个回调方法来处理用户的请求,回调方法有两个参数: req - 代表http request 相关的信息,res - 代表 http 输出的相关信息。
在命令行运行:
然后打开浏览器,输入 localhost:3000 即可看到输出的结果。
使用 request 事件处理HTTP请求
新建一个名为: httpServerWithRequest.js 文件,在文件中填入以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
| var http = require('http')
var server = new http.Server();
server.on('request', function(req, res) { res.writeHead(200, {'Content-Type': 'text/html'}); res.write('<h1>Node.js</h1>'); res.end('<p>Request Event</p>'); })
server.listen(3000);
console.log('Http server is listening at port 3000.');
|
注意到我们使用了 node 中的事件机制,通过监听 request 事件来处理 http 请求
处理Post的请求
在 HTTP Post 请求中,需要从 request 的 Body 中获取用户上传的参数。 新建名为: httpServerRequestPost.js 的文件,在文件中填入一下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| var http = require('http'); var querystring = require('querystring'); var util = require('util');
http.createServer(function(req, res) { var post = '';
req.on('data', function(chunk) { post += chunk; });
req.on('end', function() { post = querystring.parse(post); res.end(util.inspect(post)); });
}).listen(3000);
console.log('Http server is listening at port 3000');
|
注意body中数据的取法
处理静态资源
对于网站中的静态资源,通常更好的方法是使用分离的Web服务器,比如:nginx, apache等。但对于小型项目,又不想增加维护成本,就可以考虑直接使用 Node.JS 来处理。
新建一个名为: httpServerStatic.js 的文件,填入一下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| var path = require('path'), fs = require('fs'); require('http').createServer(function(req, res) { var file = path.normalize('.' + req.url); console.log('Trying to serve', file);
function reportError(err) { console.log(err); res.writeHead(500); res.end('Internal Server Error'); }
fs.exists(file, function(exist) { if (exist) { fs.stat(file, function(err, stat) { var rs;
if (err) { return reportError(err); }
if (stat.isDirectory()) { res.writeHead(403); res.end('Forbidden'); } else { rs = fs.createReadStream(file);
rs.on('error', reportError);
res.writeHead(200); rs.pipe(res); } }); } else{ res.writeHead(404); res.end('Not found'); } }); }).listen(4000);
|
可以看到,实现是直接将请求的文件读入并传给客户端。
下一步
在 下一个实验 中,将综合前几次实验的结果,构建一个 TODO API 服务。