node實戰開發

如果你真想用node做服務器來開發項目,我的建議是你在看完啟航文檔后就可以去搞express或者它的下一版本KOA了,因為用原生的來開發實在太晦澀(慢)了,這不是noder的風格。

如果你還是想深入的了解,可以往下看,我給諸位準備了個小DEMO,希望對你有幫助。


  • 項目名稱:用戶登錄系統

  • 項目簡述:項目包含首頁和登錄頁面,用戶點擊首頁的登錄按鈕跳轉到登錄頁面,填寫用戶名和密碼,點擊確認按鈕,如果正確則提示登錄成功,并跳轉到首頁,如果失敗則提示登錄失敗。

  • 項目架構 原生nodejs


  • 首先創建倆頁面index.html 和 login.html(放在template文件夾下),如下(好裸,但說的是原理,相看好看的可以看HTML/CSS文集,里面會持續跟新很多漂亮的布局和頁面效果)
<!--index.html-->
<!DOCTYPE>
<html>  
  <meta charset='utf-8'><!--否則中文亂碼-->
  <body>
    <button onclick = 'javascript:location.href="/login"'></button>
  </body>
</html>
<!--login.html-->
<!DOCTYPE>
<html>
  <meta charset='utf-8'>
  <body>
    <form>
        <input type='text'  id='name'/>
        <input type='password'  id='pwd'/>
        <input type='button' value='提交' id='submit'/> 
     </form>
     <script type='text/javascript'>
            //使用原生ajax提交表單。項目很小,就不用框架了(IE5-6會有問題)
            var _submit = document.getElementById('submit');
            _submit.onclick = function(){
                  var _name = document.getElementById('name').value;
                  var _pwd = document.getElementById('pwd').value;
                  var _req = new XMLHttpRequset();
                  _req.open('POST','/checkLogin');
                  _req.send('name='+_name+'&pwd='+_pwd);
                  _req.onreadystatechange = function(){
                        if(_req.readyState == 4 && _req.status === 200){
                            if(_req.responseText == '0'){
                                   alert('登錄成功!');
                                   location.href='/'; 
                            }else if(_req.responseText == '1'){
                                   alert('帳號或密碼錯誤,請重試');
                            }
                        }
                  }
            }
     </script>
  </body>
</html>
  • 修改我們寫過的file.js文件
'use strict'  //這一行是ES6下為防止不兼容加的
var fs = require('fs'); 
function resHtml=function(htmls){
  return fs.readFileSync(htmls); //注意這里用阻塞方式讀取頁面文件,不然會報錯。
}
module.exports = resHtml;
  • 為了防止中途會出現什么bug,我們先修改下index.js來看下效果
'use strict'
var resHtml = require('./file'); //引入我們自己的模塊
var http = require('http');  
http.createServer(function(req,res){  
      res.writeHead(200,{'Content-Type':'text/html'});   //注意這里將text/plain 改成了text/html 這是定義輸出的文本格式  
      res.write(resHtml('template/index.html')); //通過模塊接口拿到數據
      res.writeEnd(); //回執結束
}).listen(3000)  //監聽3000的端口
  • 運行服務器并在瀏覽器中查看,看是否輸出頁面,如果到這里沒有問題請繼續往下走,如果有看報錯然后修改。

  • 創建路由文件route.js

function route(path){
    console.log('path:'+path);
}
//這里我們什么也沒有做,只是為了讓大家看得更清除
exports.route = route;
  • 修改index.js文件
'use strict'
var resHtml = require('./file'); 
var http = require('http');  
var route = require('./route');
var url = require('url');
http.createServer(function(req,res){
      var path =  url.parse(req.url).pathname; //獲取訪問路徑并格式化;
      route.route(path); 
      res.writeHead(200,{'Content-Type':'text/html'});
      res.write(resHtml('template/index.html'));
      res.writeEnd(); 
}).listen(3000);
  • 運行服務器并在瀏覽器中查看,在地址欄中輸入不同的路由,然后看控制臺上的輸出。有的會有兩個(比如根目錄會是 / 和 /favicon.ico,這無關緊要,我們取數組的第一個元素)

現在開始加速開發了

  • 更改index.js
'use strict'
var resHtml = require('./file'); 
var http = require('http');  
var route = require('./route');
var url = require('url');
http.createServer(function(req,res){      
      route.route(req,res);     
}).listen(3000);
  • 更改route.js
var Controller = require('./controller');
var controller = new Controller;
function route(req,res){
     var path =  url.parse(req.url).pathname; //獲取訪問路徑并格式化;
     switch(path){
        case '/':
            controller.home(res);
            break;
        case '/login':
            controller.login(res);
            break;
         case '/checkLogin':
             constroller.checkLogin(req,res);
             break;
         default:
             break;
    }
}
exports.route = route;
  • 創建 controller.js文件,并修改如下
//這個東西不贅述,不懂的看js的進階文集,里面有講
var resHtml = require('./file')
function controller(){
      this.home = function(res){
            res.writeHead(200,{'Content-Type':'text/html'});
            res.write(resHtml('template/index.html'));
            res.writeEnd(); 
      }
      this.login = function(res){
            res.writeHead(200,{'Content-Type':'text/html'});
            res.write(resHtml('template/index.html'));
            res.writeEnd(); 
      }
      this.checkLogin(req,res){
             //TODO;
      }
}
module.controller = controller;
  • 至此,你運行服務器在瀏覽器中可以操作了,從 / 跳轉到 /login;同時基本的框架分層也清晰了。當然,如果真正用它來搞,還需要很多工作要做,比如里面好多writeHead的重復啊,路由書寫的不美觀等。如果你是個技術發燒友,可以自己去搞了。

  • 下面我們針對controller中的checkLogin來搞

var qs = require('querystring');   //字符串序列化模塊
// ... ... 
  this.checkLogin(req,res){
       var postString = '';
       req.on('data',function(chunk){   //node不會自動解析請求體,需要手動搞;
          postString+=chunk;
      })
      req.on('end',function(){
           var postJson = qs.parse(postString); //序列化為post請求格式
            if(postJson.name == 'bob' && postJson.pwd == 'lisa'){
                  res.writeHead(200,{'Content-Type':'text/plain'});
                  res.write('0');
                  res.writeEnd(); 
            }
            else{
                  res.writeHead(200,{'Content-Type':'text/plain'});
                  res.write('1');
                  res.writeEnd(); 
            }
      })
  }

運行你的項目吧~


至此,這個簡單的demo就完成了!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,826評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,734評論 25 708
  • 文章分類 后臺文章分類列表頁模板導的詳細步驟建立數據表blog_category,并添加相應的文章字段使用php ...
    JoyceZhao閱讀 1,750評論 0 14
  • 22年12月更新:個人網站關停,如果仍舊對舊教程有興趣參考 Github 的markdown內容[https://...
    tangyefei閱讀 35,207評論 22 257
  • 我還是很喜歡你像風走了八千里不問歸期 我還是很喜歡你 像去年此時的天高云淡 湖水蔚藍 我還是很喜歡你 像多情措依偎...
    忙著優秀i閱讀 261評論 0 1