在還沒有正式的學Node.js的時候, 你們認為Node.js 對於前端來說是什麼呢? 會認為Node.js 是框架? 認為這是類似Jquery的一個快速、簡潔的JavaScript框架? 反正我自己起初是這麼認為的,因為它後面有個 .js。 那麼在正式開始接觸Node.js的時候,才發現自己是有多 ...
在還沒有正式的學Node.js的時候, 你們認為Node.js 對於前端來說是什麼呢?
會認為Node.js 是框架? 認為這是類似Jquery的一個快速、簡潔的JavaScript框架? 反正我自己起初是這麼認為的,因為它後面有個 .js。
那麼在正式開始接觸Node.js的時候,才發現自己是有多麼愚蠢。在進入了Node.js的官網後,看完對Node的介紹一後才發現 Node 和 Js 都好猛啊。
官方對Node.js就簡單的一句話:(Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.) Node.js 是一個基於 Chrome V8 引擎的 JavaScript 運行時。
在看完這個介紹的時候反正起初是懵逼的,因為我壓根不瞭解 什麼叫 基於 Chrome V8 引擎的 JavaScript 運行時,然後我關顧各個大佬的博客來看看大佬們對Node.js的理解後,初步在自己頭腦有了對Node.js有了大概的概念。 Node.js就是一款工具 一個基於 Chrome V8 引擎的 在 服務端 運行JavaScript代碼的工具。 說白了就是 為了給JavaScript 在服務端運行提供了一個環境。
瞭解完Node.js後,就開始在網上找了個教學視頻簡單的學習下Node.js並且做了個簡單的留言本案例
app.js (這個 js 腳本是在服務端運行的 和 瀏覽器的 js 不同 沒有DOM BOM)
1 var http = require('http') 2 var fs = require('fs') 3 var template = require('art-template') 4 var url = require('url') 5 // silly-datetime 模塊 可以獲取當前時間 6 var time = require('silly-datetime') 7 var comments =[ 8 { 9 name: '張三', 10 message: '今天天氣不錯!', 11 dateTime: '2015-10-16 22:17' 12 }, 13 { 14 name: '李四', 15 message: '今天天氣不錯!', 16 dateTime: '2015-10-16 18:30' 17 }, 18 { 19 name: '王二', 20 message: '今天天氣不錯!', 21 dateTime: '2015-10-16 15:12' 22 }, 23 { 24 name: '陳臣', 25 message: '今天天氣不錯!', 26 dateTime: '2015-10-16 10:31' 27 }, 28 { 29 name: '二狗', 30 message: '今天天氣不錯!', 31 dateTime: '2015-10-16 8:42' 32 } 33 ] 34 // 對於我們來講,其實只需要判定,如果你的請求路徑是 /pinglun 的時候,那我就認為你提交表單的請求過來了 35 http.createServer(function(req,res) { 36 // 使用 url.parse 方法將路徑解析為一個方便操作的對象,第二個參數為 true 表示直接將查詢字元串轉為一個對象(通過 query 屬性來訪問) 37 var parseObj = url.parse(req.url, true) 38 // 單獨獲取不包含查詢字元串的路徑部分(該路徑不包含 ? 之後的內容) 39 var pathname = parseObj.pathname 40 if( pathname === '/') { 41 fs.readFile('./views/index.html', function(err,data) { 42 if(err) { 43 return res.end('404 Not Found') 44 }else { 45 var htmlStr = template.render(data.toString(),{ 46 comments:comments 47 }) 48 res.end(htmlStr) 49 } 50 }) 51 // /public 整個 public 目錄中的資源都允許被訪問 52 // .indexOf()方法 檢測 請求地址url中 有沒有是 /public 開頭的 ===0 如果有執行裡面的代碼 53 // 例如: 請求路徑是: http://127.0.0.1:3000/public/...... 54 }else if(pathname === '/post') { 55 fs.readFile('./views/post.html', function(err,data) { 56 if(err) { 57 return res.end('404 Not Found') 58 }else { 59 res.end(data) 60 } 61 }) 62 }else if(pathname.indexOf('/public/') === 0) { 63 // /public/css/main.css 64 // /public/js/main.js 65 // /public/lib/jquery.js 66 // 統一處理: 67 // 如果請求路徑是以 /public/ 開頭的,則我認為你要獲取 public 中的某個資源 68 // 所以我們就直接可以把請求路徑當作文件路徑來直接進行讀取 69 70 fs.readFile('.' + pathname, function(err,data) { 71 if(err) { 72 return res.end('404 Not Found') 73 }else { 74 res.end(data) 75 } 76 }) 77 }else if(pathname === '/pinglun') { 78 // 1. 獲取表單提交的數據 parseObj.query 79 // 2. 將當前時間日期添加到數據對象中,然後存儲到數組中 80 // 3. 讓用戶重定向跳轉到首頁 / 81 // 當用戶重新請求 / 的時候,我數組中的數據已經發生變化了,所以用戶看到的頁面也就變了 82 var comment = parseObj.query 83 // 獲取當前時間 84 comment.dateTime = time.format(new Date(), 'YYYY-MM-DD HH:mm') 85 // .push()方法 追加到數組的末尾 .unshift()方法追加到數組的開頭 86 comments.unshift(comment) 87 // comments.push(comment) 88 89 // 服務端這個時候已經把數據存儲好了,接下來就是讓用戶重新請求 / 首頁,就可以看到最新的留言內容了 90 91 // 如何通過伺服器讓客戶端重定向? 92 // 1. 狀態碼設置為 302 臨時重定向 93 // statusCode 94 // 2. 在響應頭中通過 Location 告訴客戶端往哪兒重定向 95 // setHeader 96 // 如果客戶端發現收到伺服器的響應的狀態碼是 302 就會自動去響應頭中找 Location ,然後對該地址發起新的請求 97 // 所以你就能看到客戶端自動跳轉了 98 res.statusCode = 302 99 // 就去請求路徑是 / 的頁面 100 res.setHeader('Location', '/') 101 res.end() 102 } 103 else { 104 // 其它的都處理成 404 找不到 105 fs.readFile('./views/404.html', function(err,data) { 106 if(err) { 107 return res.end('404 Not Found') 108 }else { 109 res.end(data) 110 } 111 }) 112 } 113 }) 114 .listen(3000, function() { 115 console.log('伺服器啟動成功了,可以通過 http://127.0.0.1:3000/ 來進行訪問'); 116 })
index.html頁面是留言本案例的首頁(當點擊發佈留言會跳轉post.html頁面中)
1 <!DOCTYPE html> 2 <!-- saved from url=(0027)http://192.168.150.76:3000/ --> 3 <html lang="en"> 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 6 <title>留言本</title> 7 <link rel="stylesheet" href="/public/lib/bootstrap/bootstrap.css"> 8 <link rel="stylesheet" type="text/css" 9 href="chrome-extension://fidicgekecdkdmkjghdgadgdmcfodfid/themes/default/content.css"> 10 </head> 11 <body> 12 <!-- <img src="/public/img/ab3.jpg" style="width:189px; height:126px"> --> 13 <div class="header container"> 14 <div class="page-header"> 15 <h1>Example page header <small>Subtext for header</small></h1> 16 <!-- <a class="btn btn-success" href="http://192.168.150.76:3000/post">發表留言</a> --> 17 <a class="btn btn-success" href="/post">發表留言</a> 18 </div> 19 </div> 20 <div class="comments container"> 21 <ul class="list-group"> 22 <!-- <li class="list-group-item">1</li>--> 23 <!-- 模板引擎 --> 24 {{each comments}} 25 <li class="list-group-item">{{$value.name}}說:{{$value.message}}<span class="pull-right">{{$value.dateTime}}</span></li> 26 {{/each}} 27 </ul> 28 </div> 29 </body> 30 </html>
post.html是寫留言的頁面(當填寫完留言後,點擊發表會將發表的內容在首頁更新並且跳轉到首頁查看更新後的頁面)
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <link rel="stylesheet" href="/public/lib/bootstrap/bootstrap.css"> 7 </head> 8 <body> 9 <div class="header container"> 10 <div class="page-header"> 11 <h1><a href="/">首頁</a> <small>發表評論</small></h1> 12 </div> 13 </div> 14 <div class="comments container"> 15 <form action="/pinglun" method="get"> 16 <div class="form-group"> 17 <label for="input_name">你的大名</label> 18 <input type="text" class="form-control" required minlength="2" maxlength="10" id="input_name" name="name" 19 placeholder="請寫入你的姓名"> 20 </div> 21 <div class="form-group"> 22 <label for="textarea_message">留言內容</label> 23 <textarea class="form-control" name="message" id="textarea_message" cols="30" rows="10" required minlength="5" 24 maxlength="20"></textarea> 25 </div> 26 <button type="submit" class="btn btn-default">發表</button> 27 </form> 28 </div> 29 </body> 30 </html>
404.html(沒有什麼說的點)
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>404</title> 6 </head> 7 <body> 8 <h1>404 您訪問的頁面失聯啦...</h1> 9 </body> 10 </html>
使用電腦的 cmd(命令提示符)啟動 app.js(此時就相當於開啟了一個web伺服器)
通過 http://127.0.0.1:3000/ 或者填寫本機的ip地址 在瀏覽器訪問 就可以看到 index.html頁面
點擊發佈留言後會跳轉到 post.html中
點擊發表後會自動跳轉到index.html頁面並且留言內容會更新
這就是整個留言本案例的基本功能,我也是跟著別人的教學一步步做的感覺功能基本實現了,就差資料庫來保存數據了,但通過這個案例基本對Node.js就會有更深的認識了。
2019-12-01 12:40:34