文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Express框架app函数如何使用

2023-07-05 08:18

关注

本篇内容主要讲解“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; //解析 jsonexports.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);

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,是不被随意修改的。

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 过载属性

调用初始化配置,其实就是 settings 山挂载很多属性:

这样一个 app 就初始化完成了。

到此,相信大家对“Express框架app函数如何使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯