日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何用Node去寫一個(gè)Web應(yīng)用框架

第一步,用node輸出一個(gè)hello world

創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括灌陽網(wǎng)站建設(shè)、灌陽網(wǎng)站制作、灌陽網(wǎng)頁制作以及灌陽網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,灌陽網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到灌陽省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

 
 
  1. var http=require('http');
  2. http.createServer(function(req,res){
  3.     var urlPares=url.parse(req.url);
  4.     var query=querystring.parse(urlPares.query);
  5.     res.end('hello world');
  6. }).listen(80);

大部分的node教程在這里會(huì)告訴你,我們很容易的建立的一個(gè)服務(wù)器。但是在實(shí)際使我們通常使用的是express.(f**k,難道Node必須要用express嗎?自己實(shí)現(xiàn)一個(gè)Web應(yīng)用框架真的很難嗎?)其實(shí)并不是。

那么既然打算自己寫我們首先要知道我們要做哪些事情。 1.路由或者智能路由 2.靜態(tài)文件輸出 3.session/cookie 4.模版渲染 5.數(shù)據(jù)庫處理 6.文件上傳

第二步,路由

路由好高大上的名字,它是干啥的?url對(duì)應(yīng)具體方法就是它該做的事情。 那么我們?yōu)槭裁床蛔寀rl對(duì)應(yīng)xxx文件的xx方法。 例如:/user/login能不能自動(dòng)對(duì)應(yīng)到user.js的login方法上。實(shí)現(xiàn)起來很難么?其實(shí)只需要幾句代碼

 
 
  1. var fs = require("fs");
  2. module.exports=function(req,res){
  3.     var query=req.query;
  4.     var urlPares=req.urlPares;
  5.     var pathname=urlPares.pathname;
  6.     var arr=pathname.split("/");
  7.     req.arr=arr;
  8.     //start 這段代碼處理默認(rèn)行為??梢韵群雎?/li>
  9.     if(arr.length==0||arr.length==1){
  10.         arr=["","index","index"];
  11.     }else if(arr.length==2){
  12.         arr.push("index");
  13.     }
  14.     if(arr[1]==""){
  15.         arr[1]="index";
  16.     }
  17.     if(arr[2]==""){
  18.         arr[2]="index";
  19.     }
  20.     //end 這段代碼處理默認(rèn)行為??梢韵群雎?/li>
  21.     if (fs.existsSync(APP_PATH+'/controller/'+arr[1]+'.js')){
  22.         var controller=require('./controller/'+arr[1]);
  23.         if(controller[arr[2]]){
  24.             controller[arr[2]](req,res);
  25.         }else{
  26.             res.writeHead(404,{'Content-Type': 'text/plain' });
  27.             res.end("你訪問的控制器不存在指定方法");
  28.         }
  29.     }else{
  30.         res.writeHead(404,{'Content-Type': 'text/plain' });
  31.         res.end("你訪問的路徑不存在");
  32.     }
  33. }

通過fs判斷文件是否存在。然后去require它就行了。APP_PATH是個(gè)全局變量表示程序入口的路徑。

第三步,靜態(tài)文件輸出

靜態(tài)文件輸出我們需要一個(gè)庫MIME

 
 
  1. var url = require("url");
  2. var fs = require("fs");
  3. var mime = require('mime');
  4. /**
  5.  * [[檢測(cè)是否為靜態(tài)資源]]
  6.  * @param   {Object}   req [[Description]]
  7.  * @param   {[[Type]]} res [[Description]]
  8.  * @returns {bool} [[Description]]
  9.  */
  10. module.exports = function (req, res) {
  11.     //正則表達(dá)式檢測(cè)文件后綴
  12.     var url_resource_reg = /.*\.(html|htm|gif|jpg|jpeg|bmp|webp|htc|swf|png|ico|txt|js|css)/;
  13.     if (!url_resource_reg.test(req.url)) {
  14.         return false;
  15.     }
  16.     var urlPares = url.parse(req.url);
  17.     var pathname = urlPares.pathname;
  18.     var fileUrl = APP_PATH + "/static" + pathname;
  19.     if (fs.existsSync(fileUrl)) {
  20.         var contentType = mime.lookup(fileUrl);
  21.         res.setHeader('Content-Type', contentType || "text/plain");
  22.         var fileStream = fs.createReadStream(fileUrl);
  23.         fileStream.pipe(res);
  24.         fileStream.on('end', function () {
  25.             res.end();
  26.         });
  27.         return true;
  28.     } else {
  29.         return false;
  30.     }
  31. }

第四步,session/cookie

這里稍微有點(diǎn)。但是代碼量也不多

 
 
  1. var sessions = {};
  2. var sessionKey = 'session_key';
  3. var EXPIRES = 30 * 60 * 1000;
  4. function randString(size) {
  5.     var result = '';
  6.     var allChar = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  7.     size = size || 1;
  8.     while (size--) {
  9.         result += allChar.charAt(rand(0, allChar.length - 1));
  10.     }
  11.     return result;
  12. }
  13. var generate = function () {
  14.     var session = {};
  15.     session.id = Date.now() + randString(12);
  16.     session.cookies = {
  17.         expire: Date.now() + EXPIRES
  18.     }
  19.     sessions[session.id] = session;
  20.     return session;
  21. }
  22. var parseCookie= function (cookie) {
  23.     var cookies = {};
  24.     if (!cookie) {
  25.         return cookies;
  26.     }
  27.     var list = cookie.split(";");
  28.     for (var i = 0; i < list.length; i++) {
  29.         var pair = list[i].split("=");
  30.         cookies[pair[0].trim()] = pair[1];
  31.     }
  32.     return cookies;
  33. }
  34. var serializeCookies = function (cookies) {
  35.     var arr = [];
  36.     for (var key in cookies) {
  37.         arr.push(serialize(key, cookies[key]));
  38.     }
  39.     return arr;
  40. }
  41. var serialize = function (name, value, option) {
  42.     var pairs = [name + '=' + encodeURI(value)];
  43.     //設(shè)置cookie默認(rèn)共用"/"路徑
  44.     option = option || {
  45.         path: "/"
  46.     };
  47.     if (option.maxAge) pairs.push('Max-Age=' + option.maxAge);
  48.     if (option.domain) pairs.push('Domain=' + option.domain);
  49.     if (option.path) pairs.push('Path=' + option.path);
  50.     if (option.expires) pairs.push('Expires=' + option.expires);
  51.     if (option.httpOnly) pairs.push('HttpOnly');
  52.     if (option.secure) pairs.push('Secure');
  53.     return pairs.join('; ');
  54. }
  55. module.exports = function (req, res) {
  56.     req.cookies = parseCookie(req.headers.cookie);
  57.     var id = req.cookies[sessionKey];
  58.     if (!id) {
  59.         req.session = generate();
  60.     } else {
  61.         var session = sessions[id];
  62.         if (session) {
  63.             if (session.cookies.expire > Date.now()) {
  64.                 session.cookies.expire = Date.now() + EXPIRES;
  65.                 req.session = session;
  66.             } else {
  67.                 delete sessions[id];
  68.                 req.session = generate();
  69.             }
  70.         } else {
  71.             req.session = generate();
  72.         }
  73.     }
  74.     for (var key in sessions) {
  75.         if (sessions[key].cookies.expire < Date.now()) {
  76.             delete sessions[key];
  77.         }
  78.     }
  79.     var writeHead = res.writeHead;
  80.     res.writeHead = function () {
  81.         delete req.cookies[ham_sessionKey];
  82.         var sessionStr = serialize(ham_sessionKey, req.session.id);
  83.         res.setHeader('Set-Cookie', serializeCookies(req.cookies).concat(sessionStr));
  84.         return writeHead.apply(res, arguments);
  85.     }
  86. }

第五步,模版渲染

這是最簡(jiǎn)單的。因?yàn)槲矣胔ttps://github.com/aui/artTemplate ,自己用自己喜歡的模塊組件就行了

第六步,數(shù)據(jù)庫處理

這里可以是用一些ORM框架。例如https://github.com/dresende/node-sql-query

第七步,文件上傳,post

這里只需要一個(gè)組件https://github.com/felixge/node-formidable

第八步,就是你把上面的代碼組織起來。

可以參考我的實(shí)現(xiàn) https://coding.net/u/as3long/p/today/git/tree/master/node_modules/ham 代碼比較亂,見諒。


文章名稱:如何用Node去寫一個(gè)Web應(yīng)用框架
文章地址:http://m.5511xx.com/article/cddccic.html