成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

express簡單實現(xiàn)

Mertens / 1824人閱讀

摘要:框架實現(xiàn)將所有請求方式寫入對象中匹配剩余路由中間件服務(wù)循環(huán)路由,匹配到就執(zhí)行它的函數(shù)用函數(shù)匹配中間件匹配一般路由靜態(tài)資源服務(wù)中間價實現(xiàn)使用

express 框架實現(xiàn)

</>復(fù)制代碼

  1. const http = require("http");
  2. const url = require("url");
  3. function createApp() {
  4. var app = {};
  5. var routes = [];
  6. // 將所有請求方式寫入app對象中
  7. http.METHODS.forEach(method => {
  8. method = method.toLocaleLowerCase();
  9. app[method] = (path, handler) => {
  10. let route = {
  11. path,
  12. method,
  13. handler
  14. };
  15. routes.push(route);
  16. };
  17. });
  18. // 匹配剩余路由
  19. app.all = (path, handler) => {
  20. let route = {
  21. method: "all",
  22. path,
  23. handler
  24. };
  25. routes.push(route);
  26. };
  27. // 中間件
  28. app.use = (path, handler) => {
  29. if(handler === undefined) {
  30. handler = path;
  31. path = "/";
  32. }
  33. let route = {
  34. method: "middle",
  35. path,
  36. handler,
  37. }
  38. routes.push(route);
  39. }
  40. // 服務(wù)
  41. let server = http.createServer((req, res) => {
  42. let method = req.method.toLocaleLowerCase();
  43. let { pathname } = url.parse(req.url, true);
  44. pathname = decodeURI(pathname);
  45. // 循環(huán)路由,匹配到就執(zhí)行它的handler函數(shù)
  46. // 用next函數(shù)
  47. let i = 0;
  48. let next = () => {
  49. if(i >= routes.length) return;
  50. let { method: m, path: p, handler: h } = routes[i];
  51. i++;
  52. if(m === "middle") {
  53. // 匹配中間件
  54. if(p == "/" || p == pathname || pathname.startsWith(p+"/")) {
  55. h(req, res, next);
  56. } else {
  57. next();
  58. }
  59. } else {
  60. // 匹配一般路由
  61. if ((m == method || m == "all") && (p == pathname || p === "*")) {
  62. h(req, res);
  63. } else {
  64. next();
  65. }
  66. }
  67. }
  68. next();
  69. });
  70. app.listen = (...rest) => {
  71. server.listen(...rest);
  72. };
  73. return app;
  74. }
  75. module.exports = createApp;
靜態(tài)資源服務(wù)中間價實現(xiàn)

</>復(fù)制代碼

  1. const path = require("path");
  2. const fs = require("fs");
  3. const url = require("url");
  4. const mime = {
  5. css: "text/css",
  6. gif: "image/gif",
  7. html: "text/html",
  8. ico: "image/x-icon",
  9. jpeg: "image/jpeg",
  10. jpg: "image/jpeg",
  11. js: "text/javascript",
  12. json: "application/json",
  13. pdf: "application/pdf",
  14. png: "image/png",
  15. svg: "image/svg+xml",
  16. swf: "application/x-shockwave-flash",
  17. tiff: "image/tiff",
  18. txt: "text/plain",
  19. wav: "audio/x-wav",
  20. wma: "audio/x-ms-wma",
  21. wmv: "video/x-ms-wmv",
  22. xml: "text/xml",
  23. unknown: "text/plain"
  24. };
  25. function static(basename) {
  26. return (req, res, next) => {
  27. let { pathname } = url.parse(req.url, true);
  28. pathname = decodeURI(pathname);
  29. let p = path.resolve(path.join(basename, pathname));
  30. fs.stat(p, (err, stats) => {
  31. if(err) next();
  32. if(stats && stats.isFile()) {
  33. let ext = path.extname(p).slice(1);
  34. res.writeHead(200, {"content-type": `${mime[ext]};charset=utf-8`})
  35. let rs = fs.createReadStream(p);
  36. rs.pipe(res);
  37. } else {
  38. next();
  39. }
  40. })
  41. }
  42. }
  43. module.exports = static;
使用

</>復(fù)制代碼

  1. const createApp = require("./app/index");
  2. const static = require("./app/static");
  3. let app = createApp();
  4. app.use(static("./static"));
  5. app.all("*", (req, res) => {
  6. res.end("404");
  7. });
  8. app.listen(8080, "127.0.0.1");

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/106846.html

相關(guān)文章

  • Express + Ejs實現(xiàn)一個簡單的WebServer

    摘要:最近在看,讀完官方的起步教程后想著該自己折騰點東西,就先用實現(xiàn)一個超簡單的,主要記錄下思路。先推薦一個入門級的簡單實戰(zhàn)項目地址。不過鑒于初學(xué),自身的思路肯定不會是最佳實踐,慢慢積累。 最近在看node.js,讀完官方的起步教程后想著該自己折騰點東西,就先用express + ejs實現(xiàn)一個超簡單的webserver,主要記錄下思路。先推薦一個nodejs入門級的簡單實戰(zhàn)項目地址。很適合...

    Tonny 評論0 收藏0
  • Express 實戰(zhàn)(五):路由

    摘要:的官方描述是是一個獨立于中間件和路由的實例,你可以將看作是只能執(zhí)行執(zhí)行中間件和路由的小心應(yīng)用。最大的不同在于只能已模塊形式存在并不能獨立運行。另外,加密的公鑰也被稱為證書。客戶端在拿到公鑰證書后會向這樣的證書頒發(fā)機構(gòu)進行驗證。 showImg(https://segmentfault.com/img/remote/1460000010820582); 作為 Express 中的最大特點...

    DevWiki 評論0 收藏0
  • Express 實戰(zhàn)(一):概覽

    摘要:一個標準性的事件就是年的橫空出世。引擎快速處理能力和異步編程風(fēng)格,讓開發(fā)者從多線程中解脫了出來。其次,通過異步編程范式將其高并發(fā)的能力發(fā)揮的淋漓盡致。它也僅僅是一個處理請求并作出響應(yīng)的函數(shù),并無任何特殊之處。 showImg(https://segmentfault.com/img/remote/1460000010819116); 在正式學(xué)習(xí) Express 內(nèi)容之前,我們有必要從大...

    zhaochunqi 評論0 收藏0
  • Express 實戰(zhàn)(七):視圖與模板:Pug 和 EJS

    摘要:而框架中最常用的兩個視圖引擎是和。實際上這些上下文對象就是會在視圖中使用到的變量。其實視圖緩存并不是緩存視圖實際上它緩存的視圖路徑。根據(jù)默認視圖引擎將缺少拓展名的視圖文件補充完整。實際上存在由不同組織維護的兩個不同版本的。 showImg(https://segmentfault.com/img/remote/1460000010821004);前面的內(nèi)容大都是關(guān)于 Express 框...

    wmui 評論0 收藏0
  • node express mongoose簡單實現(xiàn)全棧之增刪改查

    摘要:作為一個有志向的前端,怎么能不搞搞全棧呢。。。地址歡迎大家多多交流前端技術(shù)啊,如果大家喜歡的話,請給我一個小小的哦 作為一個有志向的前端,怎么能不搞搞全(zhuang)棧(bi)呢。。。說搞咱就搞啊,后端就用node,數(shù)據(jù)庫就用mongodb,前端呢,呃,再搞個node的web框架express,思路搞定,開始搭建我們的環(huán)境,搭建之前還是先看看我們的目標和成果 項目的目標和成果 sh...

    AndroidTraveler 評論0 收藏0
  • Express 實戰(zhàn)(四):中間件

    摘要:調(diào)用函數(shù)執(zhí)行下一個中間件函數(shù)。然后,該中間件調(diào)用函數(shù)檢查文件是否存在。為了代碼更加清晰,你也可以將代碼改寫為另外,這里在調(diào)用函數(shù)是使用的是作為輸出選項。事實上,中間件有兩種類型。 原生 Node 的單一請求處理函數(shù),隨著功能的擴張勢必會變的越來越難以維護。而 Express 框架則可以通過中間件的方式按照模塊和功能對處理函數(shù)進行切割處理。這樣拆分后的模塊不僅邏輯清晰,更重要的是對后期維...

    mochixuan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<