溫馨提示×

溫馨提示×

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

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

Express框架app函數(shù)如何使用

發(fā)布時間:2023-03-09 14:31:20 來源:億速云 閱讀:92 作者:iii 欄目:開發(fā)技術(shù)

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

    express 函數(shù)來源

    首先要搞明白 express 是一個函數(shù)。

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

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

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

    express 的其他輸出

    exports.application = proto; // application 的原型
    exports.request = req; // 請求對象
    exports.response = res; // 響應(yīng)對象
    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"); // 靜態(tài)地址
    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 的事件觸發(fā)

    • 混入 application 原型

    app 中掛載請求/響應(yīng)對象

    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 對應(yīng)的文件中,獲取 req/res 兩個不同對象。然后使用 Object.create 添加原型,然后創(chuàng)建了 value 是 app 的內(nèi)容。這個操作的作用是在 res/req 兩個對象中使用 app 函數(shù)以及掛載的對象。

    app 中的原型

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

    "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;
    }

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

    app 對象上掛載方法

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

    • 定義 app 方法

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

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

    app 初始化

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

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

    • cache

    • engines

    • settings 配置

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

    • 獲取環(huán)境變量

    • 啟動 x-powered-by

    • 設(shè)置 etag 是 weak

    • 設(shè)置環(huán)境變量

    • 設(shè)置 query parser

    • 設(shè)置 subdomain offset

    • 設(shè)置 trust proxy

    • 設(shè)置 this.settings trustProxyDefayultSymbol 的屬性

    • 添加 mount 監(jiān)聽函數(shù)

    • 配置 locals

    • 配置最好的 app 掛載到 /

    • 配置 local.settings 為 this.settings

    • 設(shè)置 view

    • 設(shè)置 views

    • 設(shè)置 jsonp callback name

    • 在生產(chǎn)環(huán)境中啟動 view cache

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

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

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

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI