1. url.parse(url)解析

该方法将一个URL字符串转换成对象并返回。

url.parse(urlStr, [parseQueryString], [slashesDenoteHost])

接收参数:

urlStr                                       url字符串

parseQueryString                   为true时将使用查询模块分析查询字符串,默认为false

我们通过解析HTTP请求,从中提取出请求的URL以及GET/POST参数。url是nodejs内置的一个模板,我们需要require("url")获取,下面的url:http://localhost:8888/start?foo=bar&hello=world,通过url.parse解析出的一个对象的各个字段名对应url的各部分。

var url = require('url');
var queryUrl = "http://localhost:8888/start?foo=bar&hello=world" ;
console.log(typeof url.parse(queryUrl)) ;
console.log(url.parse(queryUrl)) ;
//输出结果如下:
/* object // typeof
{
    protocol: 'http:',
    slashes: true,
    auth: null,
    host: 'localhost:8888',
    port: '8888',
    hostname: 'localhost',
    hash: null,
    search: '?foo=bar&hello=world',
    query: 'foo=bar&hello=world',
    pathname: '/start',
    path: '/start?foo=bar&hello=world',
    href: 'http://localhost:8888/start?foo=bar&hello=world'
}

加以说明如下:  
  protocol: 请求协议
  host: URL主机名已全部转换成小写, 包括端口信息
  auth:URL中身份验证信息部分
  hostname:主机的主机名部分, 已转换成小写
  port: 主机的端口号部分
  pathname: URL的路径部分,位于主机名之后请求查询之前
  search: URL 的“查询字符串”部分,包括开头的问号。
  path: pathname 和 search 连在一起。
  query: 查询字符串中的参数部分(问号后面部分字符串),或者使用 querystring.parse() 解析后返回的对象。
  hash: URL 的 “#” 后面部分(包括 # 符号) */

用下面的图更形象的描述说明给大家:

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

2. 路由选择实现代码

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

那么,我们接下来就创造一个叫做 路由 的模块吧。

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

 //-----------------router.js--------------------------------
 module.exports={
     login:function(req,res){
         res.write("我是login方法");
     },
     register:function(req,res){
         res.write("我是注册方法");
     }
 } 

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

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

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

3. 向页面输出html文件

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

首先我们新增两个页面

1.login.html

 <html>
 <head>
 </head>
 <body>
 登录:
 <p>这是一个段落</p>
 <h1>样式1</h1>
 </body>
 <html>

2.register.html

 <html>
 <head>
 </head>
 <body>
 注册:
 <p>这是一个段落</p>
 <h1>样式1</h1>
 </body>
 <html>

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

 //-------------models/file.js-------------------------
 var  fs=  require('fs');
 module.exports={
     readfile:function(path,callback){          //异步读文件,需要传入回调函数
         fs.readFile(path,  function  (err,  data)  {
             if  (err)  {
                 console.log(err);
             }else{
                 callback(data);
             }
         });
         console.log("异步方法执行完毕");
     },
     readfileSync:function(path){      //同步读取
         var  data  =  fs.readFileSync(path,'utf-8');
         console.log("同步方法执行完毕");
         return  data;                
     }
 }

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

 //-----------------router.js--------------------------------
 var file = require('./models/file');
 module.exports={
     login:function(req,res){
         var callback=function(data){
             res.write(data);
             res.end();
         }
         file.readfile('./views/login.html',callback);//使用异步读取
     },
     register:function(req,res){
         var data=file.readfileSync('./views/register.html');//使用同步读取
         res.write(data);
         res.end();
     }
 } 

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

nodejs进阶(3)—路由处理的更多相关文章

  1. nodejs进阶(5)—接收请求参数

    1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword=地球.通过前面的进 ...

  2. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  3. nodejs进阶(4)—读取图片到页面

    我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...

  4. nodejs进阶(1)—输出hello world

    下面将带领大家一步步学习nodejs,知道怎么使用nodejs搭建服务器,响应get/post请求,连接数据库等. 搭建服务器页面输出hello world var  http  =  require ...

  5. Ionic APP-Web SPA开发进阶(二)Ionic进阶之路由去哪了

    Ionic进阶之路由去哪了 项目需求 在查看药品时,从药品列表中可以通过点击药品列表获取某一药品详情.提交订单时,同样可以查看药品详情.两种情形下,从药品详情返回后,应分别返回至原来的页面.如下图所示 ...

  6. Nodejs进阶:核心模块https 之 如何优雅的访问12306

    本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 模块概览 这个模块的重要性,基本不用强调了.在网络安全问题日益严 ...

  7. Nodejs进阶:基于express+multer的文件上传

    关于作者 程序猿小卡,前腾讯IMWEB团队成员,阿里云栖社区专家博主.欢迎加入 Express前端交流群(197339705). 正在填坑:<Nodejs学习笔记> / <Expre ...

  8. nodejs开发 express路由与中间件

    路由 通常HTTP URL的格式是这样的: http://host[:port][path] http表示协议. host表示主机. port为端口,可选字段,不提供时默认为80. path指定请求资 ...

  9. Nodejs进阶:如何玩转子进程(child_process)

    本文摘录自个人总结<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 模块概览 在node中,child_process这个模 ...

随机推荐

  1. 嵌入式&amp;iOS:回调函数(C)与block(OC)回调对比

    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...

  2. 继续(3n+1)猜想

    卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对n=3进行验证的时候, ...

  3. hdu 4920 Matrix multiplication bitset优化常数

    Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  4. Unbalanced calls to begin/end appearance transitions for **

    在自定义UITabBarController中点击视图跳转的时候,有可能就出现这个问题, 解决方法就是在自定义的UITabBarController中的视图显示消失通知方法中添加如下方法: - (vo ...

  5. 在shiro-cas中实现 Jasig-cas的Single Sign Out 功能

    1 Single Sign Out 功能 即单点登出功能.也就是在任意子系统进行登出操作后,其他子系统会自动登出. 实际CAS登出的步骤为 所以每个子系统都需要实现一个sso登出响应. cas-cli ...

  6. 如何浏览并管理 Outlook 邮件?

    当你的邮件多起来的时候你就不得不考虑这个问题了,如何处理各种邮件? 如何浏览并管理 Outlook 邮件? 待续~

  7. Powershell学习之道-文件夹共享及磁盘映射

    导读 在Linux环境下,我们很轻易就能得心应手地通过命令操作一切事物,在Windows下,Powershell也算是后起之秀,提供大量的cmdlet以及c#的横向拓展.下面将由小编带领大家通过Pow ...

  8. ASP注入靶机

     ASP:   <%  Dim Db,MyDbPath dim conn '可修改设置一:========================定义数据库类别,1为SQL数据库,0为Access数据库 ...

  9. Drupal8开发教程:认识.info.yml文件

    YAML 文件是新引入的重要项目文件,在 Drupal 8 中,无论是模块.主题还是安装配置文件,都需要 .info.yml 文件来为其存储项目相关的基础信息. 在 Drupal 中,.info.ym ...

  10. Java 集合转换(数组、List、Set、Map相互转换)

    转自:http://blog.csdn.net/top_code/article/details/10552827 package com.example.test; import java.util ...