码迷,mamicode.com
首页 > Web开发 > 详细

nodejs进阶3-路由处理

时间:2017-01-03 20:32:09      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:读取文件   res   localhost   ring   tle   replace   ports   style   输出   

1. 路由选择过程

处理不同的HTTP请求在我们的代码中是一个不同的部分,叫做“路由选择”。

那么,我们接下来就创造一个叫做 路由 的模块吧。我们需要查看HTTP请求,从中提取出请求的URL以及GET/POST参数。

                               url.parse(string).query
                                           |
           url.parse(string).pathname      |
                       |                   |
                       |                   |
                     ------ -------------------
http://localhost:8888/start?foo=bar&hello=world
                                ---       -----
                                 |          |
                                 |          |
              querystring(string)["foo"]    |
                                            |
                         querystring(string)["hello"]

2. 路由选择实现代码

新建属于服务器端的路由文件router.js

1 //-----------------router.js--------------------------------
2 module.exports={
3     login:function(req,res){
4         res.write("我是login方法");
5     },
6     register:function(req,res){
7         res.write("我是注册方法");
8     }
9 } 

服务端调用路由,方式和上一节课《nodejs进阶2--函数模块调用》中最后提到的字符串调用函数一样。

 1 //---------4_router.js-----------
 2 var http = require(‘http‘);
 3 var url = require(‘url‘);
 4 var router = require(‘./router‘);
 5 http.createServer(function    (request,    response)    {
 6         response.writeHead(200,    {‘Content-Type‘: ‘text/html; charset=utf-8‘});
 7         if(request.url!=="/favicon.ico"){
 8                 var pathname = url.parse(request.url).pathname;//得到请求的路径
 9                 console.log(pathname);
10                 pathname = pathname.replace(/\//, ‘‘);//替换掉前面的/
11                 console.log(pathname);
12                 router[pathname](request,response);
13                 response.end(‘‘);
14         }
15 }).listen(8000);
16 console.log(‘Server running at http://127.0.0.1:8000/‘);    

上面我们用到了node自带模块url。url.path(urlStr):将一个URL字符串转换成对象并返回。

3. url.path(urlStr)实例

下面展示两个url.parse的实例

例1.  url.parse(‘http://stackoverflow.com/questions/17184791‘).pathname    
结果为:
"/questions/17184791"

 例2:

 1 var url = require(‘url‘);
 2 var a = url.parse(‘http://example.com:8080/one?a=index&t=article&m=default‘);
 3 console.log(a);
 4  
 5 //输出结果:
 6 { 
 7     protocol : ‘http‘ ,
 8     auth : null ,
 9     host : ‘example.com:8080‘ ,
10     port : ‘8080‘ ,
11     hostname : ‘example.com‘ ,
12     hash : null ,
13     search : ‘?a=index&t=article&m=default‘,
14     query : ‘a=index&t=article&m=default‘,
15     pathname : ‘/one‘,
16     path : ‘/one?a=index&t=article&m=default‘,
17     href : ‘http://example.com:8080/one?a=index&t=article&m=default‘
18 }

4. 向页面输出html文件

对于一般的get请求,例如localhost/login 我们需要给浏览器输出个页面login.html,那我们怎么做呢?

首先我们新增两个页面

1.login.html

1 <html>
2 <head>
3 </head>
4 <body>
5 登录:
6 <p>这是一个段落</p>
7 <h1>样式1</h1>
8 </body>
9 <html>

2.register.html

1 <html>
2 <head>
3 </head>
4 <body>
5 注册:
6 <p>这是一个段落</p>
7 <h1>样式1</h1>
8 </body>
9 <html>

读取文件的方法,我们放到文件models/file.js里

 1 //-------------models/file.js-------------------------
 2 var  fs=  require(‘fs‘);
 3 module.exports={
 4     readfile:function(path,callback){          //异步读文件,需要传入回调函数
 5         fs.readFile(path,  function  (err,  data)  {
 6             if  (err)  {
 7                 console.log(err);
 8             }else{
 9                 callback(data);
10             }
11         });
12         console.log("异步方法执行完毕");
13     },
14     readfileSync:function(path){      //同步读取
15         var  data  =  fs.readFileSync(path,‘utf-8‘);
16         console.log("同步方法执行完毕");
17         return  data;                
18     }
19 }

router.js需要调用文件读取方法,把两个页面html文件读取出内容并输出到response。需要注意的是:res.end()这句话的位置,如果用异步读文件的方法就不能放到server创建那块了

 1 //-----------------router.js--------------------------------
 2 var file = require(‘./models/file‘);
 3 module.exports={
 4     login:function(req,res){
 5         var callback=function(data){
 6             res.write(data);
 7             res.end();
 8         }
 9         file.readfile(‘./views/login.html‘,callback);//使用异步读取
10     },
11     register:function(req,res){
12         var data=file.readfileSync(‘./views/register.html‘);//使用同步读取
13         res.write(data);
14         res.end();
15     }
16 } 

我们重新运行:node 4_router.js。分别在浏览器输入http://localhost:8000/login 和http://localhost:8000/register  ,输出了login.html和register.html页面的内容。

技术分享技术分享

 

nodejs进阶3-路由处理

标签:读取文件   res   localhost   ring   tle   replace   ports   style   输出   

原文地址:http://www.cnblogs.com/fangsmile/p/6245915.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!