(技术)Node.js学习笔记 -- Node.js路由

先说说路由是干嘛的。
路由就是把对应的请求地址,指定到对应的处理方法上。
因此,要为路由提供请求的URL和其他需要的GET以及POST参数,然后路由根据这些数据
执行相应的代码。

下面问题来了,既然路由需要请求URL和参数,该怎么获取URL请求路径和参数呢?
我们需要的所有的数据都包含在request对象中,该对象最为onRequest()回调函数的第一个参数传递
解析URL和参数用到了Node.js其他模块: url 、 querystring 。
下面分别介绍如何使用 url 和 querystring 获取参数。

  1. url 获取请求的路径与参数
示例:
http://localhost:8888/start?name=jim&age=22

url.parse(string).pathname         →   /start
url.parse(string).query            →   name=jim&age=22

代码示例如下:

// 引入 http模块
var http = require('http');
// 引入 url 模块
var url = require('url');

// 匿名函数作为参数传递给http.createServer()
http.createServer(function(request,response){
    // 设置 charset=utf-8 否则会乱码
    response.writeHead(200,{'Content-Type':'text/plain;charset=utf-8'});
       //  /start?name=jim&age=22
       console.log("request.url:   "+request.url);
      
    // 获取访问的路径  /start
    var pathname = url.parse(request.url).pathname;
    // 获取参数值 name: jim , age: 12
    var params = url.parse(request.url,true).query; // true 不能缺少,否则会报错
    response.write("访问路径pathname:   "+pathname+"\n");
    response.write("姓名name:   "+params.name+"\n");
    response.write("年龄age:    "+params.age);
    console.log("访问路径pathname:"+pathname+"\n"+"姓名name:"+params.name+"\n"+"年龄age:"+params.age);
    response.end();
}).listen(8888);

console.log('server is running http://127.0.0.1:8888/start?name=jim&age=22');

运行结果:
      server is running http://127.0.0.1:8888/start?name=jim&age=22
      request.url:   /start?name=jim&age=22
      访问路径pathname:   /start
      姓名name:   jim
      年龄age:    22

2.querystring 获取请求的路劲与参数

示例:
http://localhost:8888/start?name=jim&age=22
querystring.parse(string)['name']         →   jim
querystring.parse(string)['age']           →    22

示例代码:


// 引入http模块
var http = require('http');
// 引入querystring模块
var querystring = require('querystring');

// 匿名函数作为参数传递给http.createServer()
http.createServer(function(request,response){

    // 设置 charset=utf-8 否则会乱码
    response.writeHead(200,{'Content-Type':'text/plain;charset=utf-8'});

    //  /start?name=jim&age=22
    console.log("request.url:   "+request.url);
    
    var name = querystring.parse(request.url)['/start?name'];
    var age = querystring.parse(request.url)['age'];

    response.write("name:"+name+"\n");
    response.write("age:"+age+"\n");
    response.end();
    console.log("姓名name:   "+name+"\n"+"年龄age:    "+age);

    var obj = querystring.parse(request.url);
    console.log("obj:  "+JSON.stringify(obj, null, 4));

}).listen(8888)


console.log('server is running http://127.0.0.1:8888/start?name=jim&age=22');

运行结果:
server is running http://127.0.0.1:8888/start?name=jim&age=22
request.url:   /start?name=jim&age=22
姓名name:   jim
年龄age:    22
obj:  {
    "/start?name": "jim",
    "age": "22"
}

以上我们可以通过请求的URL路径区别不同的请求了,然后将请求以URL路径为基准映射到处理程序上使用
不同的代码来处理。

接下来我们编写一个路由用以获取请求的URL路径,并且把路由与服务器整合起来。
编写路由就是编写一个js文件,并且作为一个模块,我们知道Node.js中一个文件其实就是一个模块。

创建一个router.js文件作为一个模块,代码如下:

function route(pathname){
    console.log("request path is "+pathname);
}

exports.route = route;

接下来我们编写一个server.js文件,作为一个模块,扩展一下服务器的start()函数,然后将路由函数做为
一个参数传递到start()函数中,server.js代码如下:

// 引入http模块
var http = require('http');
// 引入 url 模块
var url = require('url');

// 这里start函数的参数route也是一个函数,函数定义在router.js文件中
function start(route){
    function onRequest(request,response){
        //通过url模块获取请求路径
        var pathname = url.parse(request.url).pathname;
        console.log('Request for '+pathname+' received.');

        // 将请求路径传递给路由函数
        route(pathname);

        response.writeHead(200,{'Content-Type':'text/plain;charset=utf-8'});
        response.write('Hello,三疯');
        response.end();
    }

    http.createServer(onRequest).listen(8888);
    console.log('Server has started.');

}

exports.start = start;


同时,我们创建index.js文件,使得路由函数注入到服务器中,
index.js文件代码如下:

// 引入 server模块儿
var server = require('E:\\nodejs\\server');
// 引入路由模块儿
var router = require('E:\\nodejs\\router');

server.start(router.route);

运行结果:
      Server is started.
      Request for /start received.


你可能感兴趣的:((技术)Node.js学习笔记 -- Node.js路由)