中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Express框架app函數如何使用

發布時間:2023-03-09 14:31:20 來源:億速云 閱讀:98 作者:iii 欄目:開發技術

本篇內容主要講解“Express框架app函數如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Express框架app函數如何使用”吧!

    express 函數來源

    首先要搞明白 express 是一個函數。

    express 函數,函數也是個對象,意味著函數上也可以掛載自己的屬性。

    module.exports = require("./lib/express");
    exports = module.exports = createApplication;
    function createApplication() {
      var app = function (req, res, next) {
        app.handle(req, res, next);
      };
      // ...
      return app;
    }

    此處省略中加的一些在這里無關的代碼,我們看到 express 函數其實是一個函數,返回一個 app 函數。app 也很簡單 app 中調用了 app.handle 方法,注意這里 app.handle 其實用來接收請求的。這里會在請求數據的時候體驗到。現在目的是分析 app 函數的創建中會做哪些事情。

    express 的其他輸出

    exports.application = proto; // application 的原型
    exports.request = req; // 請求對象
    exports.response = res; // 響應對象
    exports.Route = Route; // 路由項目
    exports.Router = Router; // 路由
    exports.json = bodyParser.json; //解析 json
    exports.query = require("./middleware/query"); // 查詢
    exports.raw = bodyParser.raw; // 生地址
    exports.static = require("serve-static"); // 靜態地址
    exports.text = bodyParser.text; // 文本
    exports.urlencoded = bodyParser.urlencoded; // 解析

    移除中間列表中包含了,使用錯誤提示:

    var removedMiddlewares = [
      "bodyParser",
      "compress",
      "cookieSession",
      "session",
      "logger",
      "cookieParser",
      "favicon",
      "responseTime",
      "errorHandler",
      "timeout",
      "methodOverride",
      "vhost",
      "csrf",
      "directory",
      "limit",
      "multipart",
      "staticCache",
    ];
    removedMiddlewares.forEach(function (name) {
      Object.defineProperty(exports, name, {
        get: function () {
          throw new Error(
            "Most middleware (like " +
              name +
              ") is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware."
          );
        },
        configurable: true,
      });
    });

    app 方法中混入原型

    var mixin = require("merge-descriptors");
    mixin(app, EventEmitter.prototype, false);
    mixin(app, proto, false);
    • 混入 Node.js 的事件觸發

    • 混入 application 原型

    app 中掛載請求/響應對象

    var req = require("./request");
    var res = require("./response");
    app.request = Object.create(req, {
      app: { configurable: true, enumerable: true, writable: true, value: app },
    });
    app.response = Object.create(res, {
      app: { configurable: true, enumerable: true, writable: true, value: app },
    });

    從 req/res 對應的文件中,獲取 req/res 兩個不同對象。然后使用 Object.create 添加原型,然后創建了 value 是 app 的內容。這個操作的作用是在 res/req 兩個對象中使用 app 函數以及掛載的對象。

    app 中的原型

    從源碼中得知,app 的 proto 并不是使用 app.prototype.xxx 來進行擴展的,而是使用 mixin 方法來進行擴展的。這里我們要了解到 JS 的原型鏈的安全問題(防止原型鏈被污染,這些重要的方法),下面倆看看 merge-description 的實現方法:

    "use strict";
    module.exports = merge;
    var hasOwnProperty = Object.prototype.hasOwnProperty;
    function merge(dest, src, redefine) {
      // ...
      if (redefine === undefined) {
        redefine = true;
      }
      Object.getOwnPropertyNames(src).forEach(function forEachOwnPropertyName(
        name
      ) {
        if (!redefine && hasOwnProperty.call(dest, name)) {
          return;
        }
        var descriptor = Object.getOwnPropertyDescriptor(src, name);
        Object.defineProperty(dest, name, descriptor);
      });
      return dest;
    }

    多余的源碼已經移除。本質就是把 src 對象上自己的屬性描述符賦值給 dest 的屬性描述符,實現了此次 merge 或者叫做 mixin。

    app 對象上掛載方法

    注意 app 上的方法不是通過 prototype 的方式掛載的,在原密碼中被標記為 @private,是不被隨意修改的。

    • 定義 app 方法

    var app = (exports = module.exports = {});
    • 方法和屬性說明

    方法說明
    defaultConfiguration初始化配置
    lazyrouter(私有)如果沒有初始化過 router, 會初始化一次 router
    handle(私有)將 req、res 對分派到應用程序中。開始管道處理。
    use代理"Router#use()"將中間件添加到應用路由器
    engine注冊模板引擎
    param代理到"Router#param()",添加一個 api 功能。
    set在 settings 對象設置一個 key-value
    path返回一個 app 的絕對路徑
    enabled檢查 settings 是否啟動
    disabled檢查 settings 是否被禁用
    enable設置 setting 是 true
    disable設置 settings 是 false
    app.[methods]按照 methods 中數組添加 app 上的 http 方法
    all特殊情況的"all"方法,將給定的路由"路徑"、中間件和回調應用于_every_ HTTP 方法。
    del是 delete 的別名
    render渲染指定名字的模板
    listen監聽鏈接

    app 初始化

    app.init = function init() {
      this.cache = {};
      this.engines = {};
      this.settings = {};
      this.defaultConfiguration();
    };

    初始化方法很簡單,this 過載屬性

    • cache

    • engines

    • settings 配置

    調用初始化配置,其實就是 settings 山掛載很多屬性:

    • 獲取環境變量

    • 啟動 x-powered-by

    • 設置 etag 是 weak

    • 設置環境變量

    • 設置 query parser

    • 設置 subdomain offset

    • 設置 trust proxy

    • 設置 this.settings trustProxyDefayultSymbol 的屬性

    • 添加 mount 監聽函數

    • 配置 locals

    • 配置最好的 app 掛載到 /

    • 配置 local.settings 為 this.settings

    • 設置 view

    • 設置 views

    • 設置 jsonp callback name

    • 在生產環境中啟動 view cache

    • 在 router 上掛載 方法排除 app.router 被廢棄的放錯誤提示

    這樣一個 app 就初始化完成了。

    到此,相信大家對“Express框架app函數如何使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    子洲县| 逊克县| 苏尼特右旗| 兴义市| 定西市| 六枝特区| 名山县| 平乐县| 桂东县| 探索| 来凤县| 江城| 阿鲁科尔沁旗| 南皮县| 赤壁市| 德钦县| 丰镇市| 华安县| 绥宁县| 云浮市| 浪卡子县| 禄劝| 泸水县| 隆子县| 合川市| 合水县| 公安县| 金寨县| 伊金霍洛旗| 永吉县| 娄烦县| 农安县| 台湾省| 龙川县| 南京市| 塘沽区| 资阳市| 运城市| 乐业县| 阜平县| 广宁县|