国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何用Node去寫一個Web應用框架

開發 前端
大部分的node教程在這里會告訴你,我們很容易的建立的一個服務器。但是在實際使我們通常使用的是express.(f**k,難道Node必須要用express嗎?自己實現一個Web應用框架真的很難嗎?)其實并不是。

第一步,用node輸出一個hello world

  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教程在這里會告訴你,我們很容易的建立的一個服務器。但是在實際使我們通常使用的是express.(f**k,難道Node必須要用express嗎?自己實現一個Web應用框架真的很難嗎?)其實并不是。

[[151676]]

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

第二步,路由

路由好高大上的名字,它是干啥的?url對應具體方法就是它該做的事情。 那么我們為什么不讓url對應xxx文件的xx方法。 例如:/user/login能不能自動對應到user.js的login方法上。實現起來很難么?其實只需要幾句代碼

  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 這段代碼處理默認行為。可以先忽略 
  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 這段代碼處理默認行為。可以先忽略 
  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.     } 

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

第三步,靜態文件輸出

靜態文件輸出我們需要一個庫MIME

  1. var url = require("url"); 
  2. var fs = require("fs"); 
  3. var mime = require('mime'); 
  4. /** 
  5.  * [[檢測是否為靜態資源]] 
  6.  * @param   {Object}   req [[Description]] 
  7.  * @param   {[[Type]]} res [[Description]] 
  8.  * @returns {bool} [[Description]] 
  9.  */ 
  10. module.exports = function (req, res) { 
  11.     //正則表達式檢測文件后綴 
  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.  
  20.     if (fs.existsSync(fileUrl)) { 
  21.         var contentType = mime.lookup(fileUrl); 
  22.         res.setHeader('Content-Type', contentType || "text/plain"); 
  23.  
  24.         var fileStream = fs.createReadStream(fileUrl); 
  25.         fileStream.pipe(res); 
  26.         fileStream.on('end', function () { 
  27.             res.end(); 
  28.         }); 
  29.         return true
  30.     } else { 
  31.         return false
  32.     } 

第四步,session/cookie

這里稍微有點。但是代碼量也不多

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

第五步,模版渲染

這是最簡單的。因為我用https://github.com/aui/artTemplate ,自己用自己喜歡的模塊組件就行了

第六步,數據庫處理

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

第七步,文件上傳,post

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

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

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

責任編輯:王雪燕 來源: IMWeb Team
相關推薦

2017-06-08 15:53:38

PythonWeb框架

2021-06-25 10:45:43

Netty 分布式框架 IO 框架

2021-06-24 10:27:48

分布式架構系統

2022-03-17 15:34:47

printf日志

2020-10-29 16:00:03

Node.jsweb前端

2025-09-23 02:11:00

2023-02-26 01:37:57

goORM代碼

2014-11-25 14:04:59

DockerDocker Nodeweb應用部署

2023-09-21 08:00:00

ChatGPT編程工具

2020-08-07 10:40:56

Node.jsexpress前端

2009-05-08 09:32:27

JavaWeb編程框架

2023-05-10 08:05:41

GoWeb應用

2017-12-12 15:24:32

Web Server單線程實現

2019-08-12 10:45:54

Flutter框架Native

2016-09-06 19:45:18

javascriptVue前端

2018-03-23 10:00:34

PythonTensorFlow神經網絡

2015-04-29 10:02:45

框架如何寫框架框架步驟

2024-03-27 11:18:02

2012-01-04 13:55:23

Canvas

2017-03-20 17:59:19

JavaScript模板引擎
點贊
收藏

51CTO技術棧公眾號

欧美黑人xxxx| 全黄性性激高免费视频| 国产极品一区| 欧美日韩精品一区视频| 久久美女福利视频| 丁香激情综合国产| 日韩中文一区| 亚洲免费一区二区| 亚洲自拍偷拍区| 欧美韩日一区| 国产精品一区二区性色av| 97超碰成人| 国产一区二区三区18| 98色花堂精品视频在线观看| 欧美三级蜜桃2在线观看| 在线免费观看黄色片| 亚洲一区二区三区四区的| 电影天堂最新网址| 亚洲精品乱码久久久久久黑人| 性生活免费在线观看| 国产精品电影一区二区三区| 色喇叭免费久久综合网| 视频在线精品一区| 69av成年福利视频| 日本无删减在线| 亚洲精品videossex少妇| 日本精品久久久久久久| 久久影视一区二区| 亚洲综合五月天| 一本久道久久久| 欧美激情手机在线视频 | 九色91在线| 欧美成年人视频网站| 国产免费av一区二区三区| 国产午夜精品一区| 亚洲免费高清视频在线| 欧美在线观看你懂的| 成人豆花视频| 欧美毛片免费观看| 中文av字幕一区| 国产精品高潮呻吟久久av无限| 色呦呦网站在线观看| 中文字幕一区二区三区视频| 日韩精品第一页| 日本免费一区二区三区等视频| 在线不卡国产精品| 欧美精品自拍| 日本在线观看一区二区三区| 2020中文字幕在线播放| 亚洲卡通欧美制服中文| 91在线导航| 亚洲女人被黑人巨大进入| 四虎精品在线观看| 国产精品免费久久久久影院| 99这里有精品| 日韩少妇内射免费播放| 亚洲一级电影视频| 波多野结衣在线播放| 免费91麻豆精品国产自产在线观看| 亚洲高清极品| 快播日韩欧美| 久久精品日韩一区二区三区| 在线的色视频| 一区二区三区精品99久久| 妖精一区二区三区精品视频| 久久亚洲高清| 欧美国产成人精品| 欧美r级在线| 欧美大片免费观看| 亚洲精品乱码| wwww.国产| 精品国产一区二区精华| 草草视频在线一区二区| 国产精品露出视频| 92精品国产成人观看免费| 视频一区二区三区国产| 伊人久久综合97精品| 婷婷综合五月| 久久久久久久激情| 日韩色在线观看| 九九热精品视频在线观看| 日韩精品一线二线三线| 国产精品美女久久久久aⅴ国产馆| 午夜激情视频在线观看| 久久久久日韩精品久久久男男| 亚洲视频二区| 黄色毛片视频| 色噜噜狠狠狠综合曰曰曰| 狠狠入ady亚洲精品| 污污视频网站免费观看| 精品免费99久久| 亚洲无中文字幕| 男女午夜刺激视频| 国产亚洲精品久久久久动| 欧美日韩国产免费观看 | 日av在线播放| 日韩一区二区欧美| 国产婷婷精品| 亚洲校园欧美国产另类| 欧美大尺度在线观看| 国产美女一区二区| 色网站免费在线观看| 国产成人91久久精品| 国产精品456露脸| 制服丝袜在线播放| 国产伦精品一区二区三区四区视频| 一区二区欧美国产| 盗摄牛牛av影视一区二区| 国产freexxxx性播放麻豆| 日韩欧美激情在线| 亚洲国产黄色| 国产三级视频在线看| 国产一区深夜福利| 亚洲欧美日韩一区| 亚瑟一区二区三区四区| 成人小视频在线看| 伊人久久久久久久久久久久久| 日本欧美韩国一区三区| 网友自拍视频在线| 99国产在线观看| 一区二区在线电影| 亚洲精品在线播放| 亚洲老女人av| 性欧美亚洲xxxx乳在线观看| 久久影院午夜片一区| 亚洲欧美专区| 国产精品无码一区二区在线| 亚洲男人天堂久| 国产老肥熟一区二区三区| 成人免费高清观看| 一本色道久久综合亚洲二区三区| 这里只有精品免费| 视频一区二区中文字幕| 国产一二区在线| 欧美在线3区| 精品国产伦一区二区三区免费| 日韩电影在线观看一区| 草草在线视频| 色婷婷777777仙踪林| 伊人成人开心激情综合网| 国产.精品.日韩.另类.中文.在线.播放| 美女的胸无遮挡在线观看| 蜜臀在线免费观看| 精品久久久91| 自拍av一区二区三区| 欧美日韩激情在线一区二区三区| 天堂成人在线| 欧美黑人3p| 亚洲欧美综合图区| 国产亚洲一本大道中文在线| 日韩三级毛片| 国产午夜精品一区理论片| 韩国精品一区二区三区六区色诱| 日韩一区二区三区精品视频| 国内精品视频666| 午夜日韩影院| 日本私人网站在线观看| 日韩美女一区| 久久99精品久久久久久青青91| 一区二区三区四区不卡在线 | 麻豆精品在线播放| 国产91亚洲精品久久久| 亚洲欧美自偷自拍另类| 91精品免费久久久久久久久| 欧美精选午夜久久久乱码6080| 九一九一国产精品| 国产精品久久久久久久久久辛辛| 免费亚色电影在线观看| 国产一区二区高清视频| 亚洲女人天堂av| 一区二区三区四区在线免费观看 | 91色琪琪电影亚洲精品久久| 精品少妇一区二区| 91蜜桃传媒精品久久久一区二区| 精品中文一区| 国产精品一区二区三区视频网站| 国产精品专区在线| 国产裸体写真av一区二区| 日韩欧美国产综合一区| 久久久久青草大香线综合精品| 婷婷综合亚洲| 成人黄色毛片| 国产h视频在线观看| 国产精品国产对白熟妇| 91夜夜未满十八勿入爽爽影院| 亚洲欧美综合区自拍另类| 亚洲一区二区三区小说| 国内欧美视频一区二区| 青青草91久久久久久久久| 2022成人影院| 亚洲精品套图| 91精品91久久久中77777老牛| 99在线视频免费观看| 久久久999精品免费| 91国偷自产一区二区开放时间 | 色噜噜久久综合| 成人激情黄色小说| 欧美黄色大片网站| 亚洲一区二区三区在线免费| 日本无删减在线|