Node.js 开发 URL 路由
Node.js 路由(router) 提供了 URL 请求路径到 Node.js 方法的一一映射机制
我们可以解析 HTTP 请求的 URL ,从 URL 中提取出请求的路径以及 GET/POST 参数
Node.js Web 应用程序所有的请求数据都被封装在 request 对象中,该对象作为 onRequest() 回调函数的第一个参数传递
我们可以使用 Node.js url 模块和 querystring 第三方模块来解析这些请求参数 :
- Node.js url 模块可以解析 URL 参数信息
- querystring 可以解析 POST 请求中放在 body(请求体中的参数)
URL 解析
解析 URL Query 参数图示
url.parse(string).query | url.parse(string).pathname | | | | | ------ ------------------- http://localhost:8080/ss?name=twle&hello=world ---- ----- | | | | querystring.parse(queryString)["name"] | | querystring.parse(queryString)["hello"]
范例
我们可以给 http.createServer 的 onRequest 回调添加一些逻辑,用来找出浏览器请求 URL 的 PATH 路径
main.js
/* * filename: main.js * author: 简单教程(www.twle.cn) * Copyright © 2015-2065 www.twle.cn. 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=twle&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: 简单教程(www.twle.cn) * Copyright © 2015-2065 www.twle.cn. 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=twle&hello=world 显示如下
说明我们开发的路由器已经起作用了