文章永久连接:https://tech.souyunku.com/?p=5444
Node.js 路由(router) 提供了 URL 请求路径到 Node.js 方法的一一映射机制
我们可以解析 HTTP 请求的 URL ,从 URL 中提取出请求的路径以及 GET/POST 参数
Node.js Web 应用程序所有的请求数据都被封装在 request 对象中,该对象作为 onRequest() 回调函数的第一个参数传递
我们可以使用 Node.js url 模块和 querystring 第三方模块来解析这些请求参数 :
1、 Node.js url 模块可以解析 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: 搜云库技术团队(tech.souyunku.com)
* Copyright © 2015-2065 tech.souyunku.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: 搜云库技术团队(tech.souyunku.com)
* Copyright © 2015-2065 tech.souyunku.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 显示如下
说明我们开发的路由器已经起作用了
干货推荐
附录:Node.js 教程:系列文章
- 一、Node.js 基础教程
- 二、Node.js 环境配置
- 三、Node.js 创建第一个应用
- 四、Node.js NPM 使用介绍
- 五、Node.js 使用淘宝 NPM 镜像
- 六、Node.js REPL ( 交互式解释器 )
- 七、Node.js 回调函数
- 八、Node.js 事件循环
- 九、Node.js EventEmitter
- 十、Node.js Buffer(缓冲区)
- 十一、Node.js Stream (流)
- 十二、Node.js 模块系统
- 十三、Node.js 函数
- 【当前读到】十四、Node.js 开发 URL 路由
- 十五、Node.js 全局对象
- 十六、Node.js 常用工具
- 十七、Node.js 文件系统( fs 模块 )
- 十八、Node.js GET-POST 请求
- 十九、Node.js 内置模块
- 二十、Node.js WEB 模块
- 二十一、Node.js Express 框架
- 二十二、Node.js RESTful API
- 二十三、Node.js 多进程
- 二十四、Node.js JXcore 打包
- 二十五、Node.js 访问 MySQL 数据库
- 二十六、Node.js 访问 MongoDB
- 二十七、Node.js OS 模块
- 二十八、Node.js DNS 模块
- 二十九、Node.js Domain 模块
- 三十、Node.js Path 模块
- 三十一、Node.js Net 模块