Javascript var express=需要(';express';);var app=express(),什么是express()??它是一个方法还是一个构造函数?它来自哪里

Javascript var express=需要(';express';);var app=express(),什么是express()??它是一个方法还是一个构造函数?它来自哪里,javascript,node.js,express,Javascript,Node.js,Express,这就是我们创建express应用程序的方式。但是这个“express()”是什么?它是一个方法还是一个构造函数?它是从哪里来的 它是一个方法还是一个构造函数 都不是;这是一个函数,虽然如果你说“方法”,我不认为有人会给你带来困难 方法是附加到对象的函数。在JavaScript中,方法主要是通过对象属性引用的函数。(更新:从ES2015开始,如果您使用方法语法来创建它们,它们的数量会稍微多一些,因为它们可以访问super) JavaScript中的构造函数是通过new操作符调用的函数。尽管其他函数

这就是我们创建express应用程序的方式。但是这个“express()”是什么?它是一个方法还是一个构造函数?它是从哪里来的

它是一个方法还是一个构造函数

都不是;这是一个函数,虽然如果你说“方法”,我不认为有人会给你带来困难

方法是附加到对象的函数。在JavaScript中,方法主要是通过对象属性引用的函数。(更新:从ES2015开始,如果您使用方法语法来创建它们,它们的数量会稍微多一些,因为它们可以访问
super

JavaScript中的构造函数是通过
new
操作符调用的函数。尽管其他函数可能会创建一些东西,但为了避免混淆,我们通常不将它们称为“构造函数”。有时,它们可能是“创建者”或“生成器”函数

它来自哪里

ExpressJS是一个
express
是模块的名称,也是我们通常给变量的名称,该变量用于在代码中引用其主要功能,如您引用的代码。NodeJS提供了,其任务是加载模块并允许您访问其导出。(您不必调用变量
express
,您可以执行
var foo=require('express');
并使用
foo
,但惯例是使用模块名称,或者如果只使用模块的一部分,则使用模块文档定义的该部分名称。)

express
的默认导出有点不寻常,因为它是一个函数,其属性也是函数(方法)。这在JavaScript中完全有效,但在其他一些语言中却相当罕见。这就是为什么您可以通过
express()
创建
应用程序
对象,但也可以使用
express.static(/*…*/)
设置服务静态文件



事实上,这是完全正常的。默认情况下,函数有两种标准方法:
调用
应用
,以及
到字符串

您将使用节点的require函数来使用express模块。require类似于其他语言中的import或include等关键字。require将包的名称作为字符串参数并返回包。返回的对象没有什么特别之处—它通常是一个对象,但可以是函数、字符串或数字

var express = require('express'); 
var app = express();
=>需要Express模块,就像您需要其他模块一样,并将其放入变量中

var express = require('express'); 
=>调用express函数“express()”并将新的express应用程序放入app变量中(以启动新的express应用程序)。 这就像是在创建一个类的对象。其中“express()”与类类似,而app是它新创建的对象

通过查看下面的express代码,您可以很好地了解内部正在发生的事情

文件1:index.js

var app = express(); 
文件2:lib/express.js

'use strict';

module.exports = require('./lib/express');
require如何工作

当您在节点中调用require('some_module')时,会发生以下情况:

  • 如果当前文件夹中存在名为some_module.js的文件,则节点将加载该文件,否则:

  • 节点在当前文件夹中查找包含某个\u模块文件夹的节点\u模块文件夹

  • 如果找不到,它将进入一个文件夹并重复步骤2


  • 此循环重复,直到节点到达文件系统的根文件夹,此时它将检查任何全局模块文件夹(例如Mac OS上的/usr/local/node_模块),如果仍然找不到某个_模块,它将抛出异常。

    。我认为最初的海报对调用module express导出的函数的语法为何不正确感到困惑

    'use strict';
    
    var EventEmitter = require('events').EventEmitter;
    var mixin = require('merge-descriptors');
    var proto = require('./application');
    var Route = require('./router/route');
    var Router = require('./router');
    var req = require('./request');
    var res = require('./response');
    
    /**
     * Expose `createApplication()`.
     */
    
    exports = module.exports = createApplication;
    
    function createApplication() {
      var app = function(req, res, next) {
        app.handle(req, res, next);
      };
    
      mixin(app, EventEmitter.prototype, false);
      mixin(app, proto, false);
    
      app.request = { __proto__: req, app: app };
      app.response = { __proto__: res, app: app };
      app.init();
      return app;
    }
    exports.application = proto;
    exports.request = req;
    exports.response = res;    
    exports.Route = Route;
    exports.Router = Router;
    });
    
    而不是

    var app = express() 
    
    澄清一下:require()函数不会创建对该“模块”的引用。没有对模块的引用。只有对模块导出的对象的引用

    require('xxx.js'),其中可以省略.js扩展名,返回该xxx.js文件导出的内容。如果xxx.js文件导出一个对象,require('xxx.js')将返回一个对象;如果导出一个函数,require('xxx.js')返回一个函数;如果导出单个字符串,require('xxx.js')将返回一个字符串

    如果您检查文件express.js的源代码,您将看到它导出一个函数。所以在

    var app = express.express()
    
    第一个express被分配模块express导出的任何内容,在本例中,模块express恰好是一个函数。express是一个函数,而不是对模块的引用。因此,在第二行,您只需调用该函数:

    var express = require('express')
    

    希望这有帮助

    让我举个例子来回答这个问题。 创建2个javascript文件。 play1.js和express.js

    var app = express()
    
    现在在play1.js文件中导入express.js

    //express.js
    function createApplication(){
       var app = 'app';
        return app;
      }
    module.exports = createApplication;
    //keep in mind that we are not doing module.exports = {createApplication}
    

    无论何时导入模块,如

    //play1.js
      var express = require('./express);
       var app = express();
     // this will call createApplication function as app is referencing to it.
       console.log(app); // "app"
    
    express是一个模块,它具有分配给它的函数、对象或变量。 看看/lib/express

    您可以在express模块中以express()的形式访问函数createApplication,因为该函数直接分配给模块,如

    //play1.js
      var express = require('./express);
       var app = express();
     // this will call createApplication function as app is referencing to it.
       console.log(app); // "app"
    
    导出=模块。导出=创建应用程序

    因此,您可以访问函数createApplication,只需将express()作为函数调用即可

    现在,当您查看express库的其他部分时,您可以看到附加到exports特殊对象的一组其他对象

    function createApplication(){
        var app = function(req, res, next) {
        app.handle(req, res, next);
      };
    //other codes
    }
    
    指定用于导出特殊对象的这些对象或函数可以使用express作为对象从导入部分访问

    express.{name}

    最后,您只需导出一组附加到模块的方法或对象。export express js文件中的特殊对象

    要阅读有关module.export特殊对象的更多信息,请转到

    首先
    /**
     * Expose the prototypes.
     */
    
    exports.application = proto;
    exports.request = req;
    exports.response = res;
    
    /**
     * Expose constructors.
     */
    
    exports.Route = Route;
    exports.Router = Router;
    
     // other exports
    
    express.Route
    express.Router etc
    
    1-  var express = require('express');
    
    2- var app = express();
    
    const modue_need1=require('module_name'); 
    const modue_need2=require('module_name2'); 
    const modue_need3=require('module_name3'); 
    const modue_need4=require('module_name4'); 
    const modue_need....=require('module_name.....');
    
    const express=require('express');
    const app=express();
    console.log(app);