14、Node.js 开发 URL 路由

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 显示如下

 

说明我们开发的路由器已经起作用了