一、课程介绍
1.1 课程内容
Web 服务器最重要的功能是什么?当然是处理http请求啦。本次课程就带大家探索http模块。
此次课程还会讲到url模块和path模块,同时也会用到前面讲过的fs模块。url模块用于解析url,path模块用于处理和转换文件路径。
1.2 课程知识点
http模块的使用
url模块
path模块
1.3 课程环境
Xfce终端
Node.js v4.2.1
gedit/vim:文本编辑
二、课程步骤
2.1 创建http server
通过Node.js创建http server非常简单,示例代码如下:
// 文件名:demo.js // 引入http模块 var http = require('http'); // 创建http server http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/');
运行此文件
$ node demo.js
然后打开浏览器,访问“http://127.0.0.1:1337/”,就会看到页面上显示了“Hello World”,说明我们的http server创建成功了。
当然,我们在这个实例要做的比这个稍微复杂一点。
在这个实例中,我们会创建一个简单的http server,所有的代码都放在app这个文件夹中。文件夹结构如下:
app ├── main.js ├── requestHandlers.js ├── router.js ├── server.js └── views ├── 404.html ├── about.html └── home.html
首先,新建一个app文件夹,在文件夹中新建server.js文件,输入如下代码(其中的注释为代码解释):
// // 创建http server // // 加载所需模块 var http = require('http'); var url = require('url'); var fs = require('fs'); // 设置ip和端口 // 实际应用中,可以把这些写到配置文件中 var host = '127.0.0.1', port = 8080; // 创建http server function start(route, handle) { // 参数 // route 判断url是否存在,存在则调用handle处理,不存在则返回404 // handle 处理不同的url请求 // 处理request请求 function onRequest(req, res) { // 使用url.parse()方法解析url // 它会把url string转化为一个object // 这样我们就可以很方便的获取url中的host、port、pathname等值了 var pathname = url.parse(req.url).pathname; console.log('Request for ' + pathname + ' received.'); // 判断并处理不同url请求 // 后面介绍此方法 route(handle, pathname, res, req); } // 使用http.createSserver()方法创建http server // 并传入onRequest()方法 // 然后使用listen()方法监听指定地址 http.createServer(onRequest).listen(port, host); console.log('Server has started and listening on ' + host + ':' + port); } // 导出 start 方法 exports.start = start;
在文件的最后,我们导出了start方法,以便在主程序中使用。你肯定注意到了,在代码中使用了route()方法,它用于处理判断请求的url是否存在,现在我们就来编写这个方法。
2.2 创建路由
在app文件夹中新建router.js,输入如下代码:
var fs = require('fs'); // 路由函数 // 处理不同url的请求 // 并返回相应内容 function route(handle, pathname, res, req) { console.log('About to route a request for ' + pathname); // 判断此url是否存在特定处理函数 // 存在则调用handle处理 // 不存在则返回404页面 if (typeof handle[pathname] === 'function') { // 后面介绍handle函数 handle[pathname](res, req); } else { console.log('No request handler found for ' + pathname); // 读取404页面 // 所有页面都存放在view文件夹下 var content = fs.readFileSync('./views/404.html'); res.writeHead(404, { 'Content-Type': 'text/html' }); res.write(content); res.end(); } } // 导出 route 方法 exports.route = route;
在此方法中,调用了handle()方法,这个方法用于处理不同的url请求。
在app文件夹中新建requestHandlers.js文件,输入如下代码:
// 处理url请求 var fs = require('fs'); // home.html 主页 function home(res) { console.log('Request handler "home" was called.'); // 读取home.html文件 var content = fs.readFileSync('./views/home.html'); res.writeHead(200, { 'Content-Type': 'text/html' }); res.write(content); res.end(); } // about.html 关于页面 function about(res) { console.log('Request handler "about" was called.'); // 读取about.html文件 var content = fs.readFileSync('./views/about.html'); res.writeHead(200, { 'Content-Type': 'text/html' }); res.write(content); res.end(); } // 导出页面处理函数 exports.home = home; exports.about = about;
这个方法比较简单,就是读取文件,然后输出到response。
2.3 创建主程序
创建http server,判断url,处理url都写完了,那么我们可以写主程序来运行http server了,在app文件夹新建main.js文件,输入如下代码:
// 主程序 // 引入server,router及requestHandler var server = require('./server'); var router = require('./router'); var requestHandlers = require('./requestHandlers'); // 保存url处理方法 var handle = {}; handle['/'] = requestHandlers.home; handle['/about'] = requestHandlers.about; // 启动http server server.start(router.route, handle);
到此,所有的服务器代码都写完了,那么我们来添加代码中用到的两个html文件吧。
2.4 创建HTML文件
在app文件夹中新建views文件夹,在views文件夹中,新建home.html文件、about.html文件和404.html文件。
文件中的代码如下所示:
home.html文件:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Home page</title> </head> <body> <p>home page</p> </body> </html>
about.html文件:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>About page</title> </head> <body> <p>about page</p> </body> </html>
404.html文件:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>404 page</title> </head> <body> <p>404 page not found</p> </body> </html>
HTML文件的代码写得比较简单,可自由发挥。
那么现在我们来运行程序吧:
$ node main.js
运行成功后,打开虚拟机桌面的浏览器,访问“http://127.0.0.1:8080”就会看到页面显示“home page”,访问“http://127.0.0.1:8080/about”就会看到页面显示“about page”,访问“http://127.0.0.1:8080”下的其他页面就会看到页面显示“404 page not found”。
三、课程总结
1、Node.js的http模块十分强大,只需几行代码就可以启动一个web服务器。
2、http模块中的createServer函数用于创建服务器,对创建出的服务器调用listen函数即可监听http请求。
四、课后习题
请你运用http模块建立一个建议的个人网站,在网站主页中显示你的个人信息。
感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程