Node.js 路由(router) 提供了 URL 请求路径到 Node.js 方法的一一映射机制
我们可以解析 HTTP 请求的 URL ,从 URL 中提取出请求的路径以及 GET/POST 参数
Node.js Web 应用程序所有的请求数据都被封装在 request 对象中,该对象作为 onRequest() 回调函数的第一个参数传递
我们可以使用 Node.js url 模块和 querystring 第三方模块来解析这些请求参数 :
1、 Node.jsurl模块可以解析URL参数信息;
2、 querystring可以解析POST请求中放在body(请求体中的参数);
URL 解析
解析URL Query 参数图示
url.parse(string).query
|
url.parse(string).pathname |
| |
| |
------ -------------------
http://localhost:8080/ss?name=souyunku&hello=world
---- -----
| |
| |
querystring.parse(queryString)["name"] |
|
querystring.parse(queryString)["hello"]
范例
我们可以给 http.createServer 的 onRequest 回调添加一些逻辑,用来找出浏览器请求 URL 的 PATH 路径
main.js
/*
* filename: main.js
* author: DDKK.COM 弟弟快看,程序员编程资料站(ddkk.com)
* Copyright © 2015-2065 ddkk.com. All rights reserved.
*/
var http = require("http");
var url = require("url");
function serv() {
function onRequest(req, res)
{
var pathname = url.parse(req.url).pathname;
res.write("<h1>Hello World</h1>");
res.write("<p>请求的路径是:" + pathname + "</p>")
res.end();
}
http.createServer(onRequest).listen(8080);
console.log("Server has started.");
}
//exports.serv = serv;
serv();
运行以上 Node.js 范例,输出结果如下
$ node main.js
Server has started.
在浏览器上打开 http://localhost:8080/ss?name=souyunku&hello=world 显示如下
现在我们的应用可以根据 URL 路径来区别不同请求了
这使我们可以使用路由(还未完成)来将请求以 URL 路径为基准映射到处理程序上
也就是说在我们所要构建的应用中,这意味着来自 /start 和 /upload 的请求可以使用不同的代码来处理
自制路由器
有了上面的基础,我们就可以自己开发一个简单的路由器了
新建一个文件 router.js 添加以下内容
router.js
function route(pathname) {
console.log("About to route a request for " + pathname);
}
exports.route = route;
这段代码现在什么也没做,这是因为我们还没添加更多的逻辑
我们先来看看如何把路由和服务器整合起来
我们的服务器应当知道路由的存在并加以有效利用,我们当然可以通过硬编码的方式将这一依赖项绑定到服务器上,但是其它语言的编程经验告诉我们这会是一件非常痛苦的事,因此我们将使用依赖注入的方式较松散地添加路由模块
我们先扩展下服务器的 serv() 函数,以便将路由函数作为参数传递过去
加载路由模块
var router = require("./router");
修改serv() 函数
main.js
/*
* filename: main.js
* author: DDKK.COM 弟弟快看,程序员编程资料站(ddkk.com)
* Copyright © 2015-2065 ddkk.com. All rights reserved.
*/
var http = require("http");
var url = require("url");
var router = require("./router");
function serv( route ) {
function onRequest(req, res)
{
var pathname = url.parse(req.url).pathname;
route(pathname);
res.write("<h1>Hello World</h1>");
res.write("<p>请求的路径是:" + pathname + "</p>")
res.end();
}
http.createServer(onRequest).listen(8080);
console.log("Server has started.");
}
//exports.serv = serv;
serv();
当然了,看起来我们仍旧什么都没做
运行以上 Node.js 脚本,输出结果如下
$ node main.js
Server has started.
然后用浏览器打开 http://localhost:8080/ss?name=souyunku&hello=world 显示如下
说明我们开发的路由器已经起作用了