【问题标题】:I know what it does, but not how...in Express.js, how does the line 'const app = express()' work exactly?我知道它的作用,但不知道如何......在 Express.js 中,'const app = express()' 行是如何工作的?
【发布时间】:2020-10-08 20:32:00
【问题描述】:

这是一个非常新手的 Node/express 问题。它已经困扰我几个星期了。我知道这是做什么的,我已经能够克服它并使用 Express 构建一些东西,但我无法理解“const app = express()”行中使用的逻辑。我不认为我以前在 javascript 中见过这个。在这种情况下, express 是一个对象,而不是一个函数,对吧?这一行让变量 'app' 可以访问许多重要的方法,如 'listen' 和 'get'。但是这里的语法不是让值 - express() - 看起来是一个函数吗?这里到底发生了什么。

【问题讨论】:

    标签: node.js express object


    【解决方案1】:

    在代码行中:

    const app = express();
    

    express 是一个函数。如果你做typeof express,它会告诉你这是一个函数。

    当您调用该函数时,它会返回一个新创建的对象,因此它是一个类似于“工厂函数”的函数。它有点像构造函数,但不是您使用new,而是对象的创建包含在函数内部。该函数创建新对象,对其进行初始化并返回它。

    您可能会感到困惑的是,express 还具有以下属性:

    express.static(...)
    express.json(...)
    

    在 Javascript 中,函数也是一个对象(您可以将函数视为从对象派生的)并且可以包含属性。所以,虽然express 是一个工厂函数,但它也可以拥有可以独立使用的属性。

    在这种情况下,express 是一个对象,而不是一个函数,对吧?

    是也不是,express 是一个函数。函数派生自object,也可以具有属性。所以,在某种程度上,你可以说它既是一个函数又是一个对象,你可以将它用作任何一个。在面向对象的术语中,对象是基类,函数是派生类,因此函数具有函数和对象的能力。

    这一行使变量“app”可以访问许多重要的方法,例如“listen”和“get”。

    const app = express(); 行创建了一个应用程序对象,该对象具有自己的方法,例如 app.get()app.post(),允许您注册路由处理程序。而且,像app.listen() 这样的方法允许您启动服务器。 app 对象上有很多方法。

    但是这里的语法不是让值 - express() - 看起来是一个函数吗?

    是的,它是一个函数。而且,Javascript 中的函数也可以有属性。

    【讨论】:

      【解决方案2】:

      好问题,

      我们有这个:

      const express = require("express"),
      const app = express()
      

      “express 常量仍然用于一些与配置应用程序相关的 Express.js 工具。app 主要用于为应用程序的数据移动和用户交互而创建的任何东西。”

      参考:乔纳森·韦克斯勒。使用 Node.js 进行编程(Kindle 位置 2619-2621)。曼宁出版社。

      据我了解, const express 是 express 模块所需的方法。

      const express = require("express")
      

      然后你使用 express() 方法来实例化一个名为“const app”的网络服务器

      const app = express()
      

      所以 const 应用程序实际上是 express.js 开发人员制作的 Web 服务器对象,它抽象了 2 个主要核心功能:

      1. 网络服务器路由映射。即注册什么 (req,res) => {} 回调函数来调用哪些路由。 所以当你的浏览器发出请求时(用 req.method 和 req.url 标识) 使用 app.get() app.post() 方法预先注册的正确回调的 express 调用
      2. http.createServer() 女巫是实际创建 Web 服务器并使用其映射(参见 1)执行 app.get() 和 app.post( )。 handle_function 负责处理来自浏览器的请求,并使用 req.url 和 req.method 来确定要在其映射中使用的回调(再次参见 1 以完整循环。)

      所以 app 是一个对象,它使开发人员不必担心使用适当的句柄回调映射浏览器请求,也不必创建网络服务器。

      此外,您还获得了一系列新的应用程序方法,可让您使用您的应用程序做不同的事情。在定义请求和响应时,您还会获得一堆方法。像 res.send()

      例如浏览器对“/about”执行“GET” 并且应用程序正在侦听并接收请求(在应用程序对象中抽象) 然后根据它的抽象映射执行回调(可能要感谢 app.listen() 方法??)

      希望这是有道理的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-22
        • 1970-01-01
        • 2023-03-29
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-28
        相关资源
        最近更新 更多