1. 程式人生 > >node實現記事留言本伺服器案例

node實現記事留言本伺服器案例

要點:

1. 直接使用url判斷路徑時,判斷的部分一定是最後一位,如127.0.0.1:3000瀏覽器預設在3000後新增一個'/',下面判斷的就是這個127.0.0.1:3000/yous就是判斷的/yous,也就是url的路徑,當後面有查詢(?後面的),不可以直接判斷url,需要使用url核心模組了。

2.注意node中地址是網頁的地址,通過服務端的處理將一些靜態資源集中到public資料夾下實現統一處理,實現將網路地址轉換成檔案地址,但是也要注意不是傳統的相對路徑的檔案地址。通過url判斷,在伺服器端的public公共資料夾下處理。

3.注意重定向的狀態碼,臨時重定向是302,重定向的地址會在響應標頭檔案中的Location中尋找。

4..注意引入js模板時,在當前工作空間下進行npm安裝,這樣傳送專案給別人時才能更好的使用,目的跟css等使用相對路徑處理檔案地址的目的是一樣的。

node檔案

var http = require('http')
var fs = require('fs')
var url = require('url')
// 引入相關的核心模組

var template = require('art-template')
// 引入js模板引擎包,在專案中也新增為了發給別人能用

var events = [
  {
  	name:'RNG',
  	date:'2018-3',
  	event:'2018LPL春季賽冠軍'
  },
  {
    name:'RNG',
  	date:'2018-8',
  	event:'2018LPL夏季賽冠軍'
  },
  {
    name:'RNG',
  	date:'2018-9',
  	event:'2018LSM季中賽冠軍'
  },
  {
    name:'IG',
  	date:'2018-11',
  	event:'S8世界總決賽冠軍!'
  }
]

// 直接使用url判斷路徑時,判斷的部分一定是最後一位,如127.0.0.1:3000瀏覽器預設在3000後新增一個'/',下面判斷的就是這個
// 127.0.0.1:3000/yous就是判斷的/yous,也就是url的路徑,當後面有查詢(?後面的),不可以直接判斷url,需要使用url核心模組了

http 
    .createServer(function(req,res){

    	var parseObj = url.parse(req.url,true)
    	// 通過url核心模組的API,將url包裝成一個物件,true表示將查詢字串轉換成一個物件(query)
    
    	var pathname = parseObj.pathname
    	// 獲取查詢字串之前的路徑
    	if(pathname === '/'){
    		fs.readFile('./views/index.html',function(err,data){
    			if(err){
    				return res.end('404')
    			}
                
                data = template.render(data.toString(),{
                    events:events
                })

    			res.end(data)
    		})
    	}
    	else if(pathname === '/jilu'){
    		//?之後的路徑全部被封裝到query中,所以可以直接使用
    		var event = parseObj.query
    		// event中的戰隊名字和榮譽
    		event.date = '2018-12'
    		events.push(event)
    		// 將最近的事件新增到events陣列中

    		res.statusCode = 302
    		// 設定狀態碼
    		res.setHeader('Location','/')
    		// 設定標頭檔案中的Location屬性,指向重定向的地址
    		res.end()

    	}
    	else if(pathname.indexOf('/public/') === 0){
    		// 將請求的靜態資源全部放入public資料夾中,可以統一地進行處理
    		// 有'/public/'開頭的網頁地址請求,改為檔案路徑請求
    		fs.readFile('.' + pathname,function(err,data){
    			if(err){
    				return res.end('404')
    			}
    			res.end(data)
    			// 前面一定不能忘記'.'因為'./'表示當前路徑,而'/'表示磁碟根目錄
    		})
    	}
    	else if(pathname === '/yous'){
    			// 沒有檔案字尾名是為了簡化url,也更美觀
                fs.readFile('./views/yous.html',function(err,data){
                	if(err){
                		return res.end('404')
                	}
                	res.end(data)
                })
        }
    	else{
    		fs.readFile('./views/404.html',function(err,data){
    			if(err){
    				return res.end('404')
    			}
    			res.end(data)
    		})
    		// 如果url地址不在上述可能下,將介面顯示為404介面,為了更好的互動和中止請求
    	}		
    })
    .listen(3000,function(){
    	console.log('success');
    })
    // 直接這樣寫,簡潔程式碼,不用再接收.createServer()的返回值了

index.html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>冠軍歷程</title>

  <link rel="stylesheet" href="/public/lib/bootstrap/bootstrap.css">
  <!-- 在伺服器端請求的靜態網站的地址,都是網站地址,區別於之前學習的專門寫的檔案地址 -->
</head>

<body>  
  <div class="header container">
    <div class="page-header">
      <h1>老哥們的年度總結 <small>一起看看吧</small></h1>
      <a class="btn btn-success" href="/yous">續寫總結</a>
    </div>
  </div>
  <div class="comments container">
    <ul class="list-group">
      {{each events}}
      <li class="list-group-item">
         <span class="pull-left text-primary">{{ $value.name }}在:</span>
         <span class="col-md-offset-4 text-danger">{{ $value.date }}獲得了</span> 
         <span class="pull-right text-success">{{ $value.event }}</span>
      </li>
      {{/each}}
    </ul>
  </div>
</body>

</html>

yous.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <link rel="stylesheet" href="/public/lib/bootstrap/bootstrap.css">
</head>

<body>
  <div class="header container">
    <div class="page-header">
      <h1><a href="/">記錄</a><small>冠軍之路</small></h1>
    </div>
  </div>
  <div class="comments container">

    <form action="/jilu" method="get">
      <!-- action屬性就是請求網站的url地址 -->

      <div class="form-group">
        <label for="input_name">老哥,你的名字</label>
        <input type="text" class="form-control" required minlength="2" maxlength="6" id="input_name" name="name" placeholder="請寫入你的姓名">
      </div>
      <div class="form-group">
        <label for="textarea_message">冠軍記錄</label>
        <textarea class="form-control" name="event" id="textarea_message" cols="30" rows="5" required minlength="5" maxlength="20"></textarea>
      </div>
      <button type="submit" class="btn btn-default">確認</button>
    </form>
  </div>
</body>

</html>

 404.html(簡陋)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <h1>老哥,你網址輸錯了,好好檢查下</h1>
</body>
</html>

效果: