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页面的内容。

最新文章

  1. ArcGIS Engine开发之量测功能
  2. java 项目中几种O实体类的概念
  3. 产生0-9 A-Z a-z
  4. Navicat for mysql 破解
  5. HDU 1372 Knight Moves【BFS】
  6. 49. 面向对象的LotusScript(十五)之Log4Dom下
  7. javascript 手机号抽奖
  8. html5重力感应事件
  9. ms08_067利用过程
  10. SSO单点登录的研究
  11. javascript中数组与字符串之间的转换以及字符串的替换
  12. NoFragment重大bug
  13. [国嵌攻略][149][Yaffs2文件系统应用]
  14. 原生sql整理
  15. java web 读取数据库数据写入Excel返回浏览器下载
  16. MySQL技巧(一)
  17. Using Dispatcher
  18. python的基本用法(四)文件操作使用
  19. 外部Jenkins调用容器中Slave配置实践
  20. 【转】Thread Local的正确原理与适用场景

热门文章

  1. 使用redis构建可靠分布式锁
  2. ABP文档 - 嵌入的资源文件
  3. Angular企业级开发(3)-Angular MVC实现
  4. 简析服务端通过GT导入SHP至PG的方法
  5. 【云知道】究极秒杀Loadrunner乱码
  6. Java定时任务的常用实现
  7. js attribute 和 jquery attr 方法
  8. 一个简单的网站web项目的详解
  9. MySQL常用命令
  10. Express 教程 01 - 入门教程之经典的Hello World