你能在 ExpressJS 应用程序中多次调用 "express()" 吗? (或者:"express()" 到底在做什么?)

Can you call "express()" more than once in an ExpressJS application? (Or: what exactly is "express()" doing?)

我已经使用 Express 一段时间了,但突然间我对一些非常基本的东西不确定 --

我正在尝试将自定义中间件添加到 KeystoneJS 应用程序——特别是我正在将 JWT 令牌端点添加到 TinyMCE 自定义字段

自定义字段是

export let Wysiwyg = {
  type: 'Wysiwyg',
  implementation: Text.implementation,
  views: {
    Controller: Text.views.Controller,
    Field: importView('./views/Field'),
    Filter: Text.views.Filter,
  },
  adapters: Text.adapters,
  prepareMiddleware,
};

并且prepareMiddleware

function prepareMiddleware() {
  const tinymcePath = dirname(require.resolve('tinymce'));
  const app = express();
  app.use(cors());

  app.use('/tinymce-assets', express.static(tinymcePath));
  app.post('/jwt', function (req, res) {
    // NOTE: Before you proceed with the TOKEN, verify your users' session or access.
    const payload = {
      sub: '123', // Unique user id string
      name: 'John Doe', // Full name of user

      // Optional custom user root path
      // 'https://claims.tiny.cloud/drive/root': '/johndoe',

      exp: Math.floor(Date.now() / 1000) + (60 * 60) // 60 minutes expiration
    };

    try {
      const token = jwt.sign(payload, privateKey, { algorithm: 'RS256'});
      res.set('content-type', 'application/json');
      res.status(200);
      res.send(JSON.stringify({
        token: token
      }));
    } catch (e) {
      res.status(500);
      res.send(e.message);
    }
  });
  return app;
}

这都是从具有自己的 ExpressJS 服务器的 KeystoneJS 应用程序调用的 运行。上面对 express() 的调用到底是做什么的? ExpressJS API docs

**express()**

Creates an Express application. The express() function is a top-level function exported by the express module.

var express = require('express')
var app = express()

我一直认为这是在创建一个新的 HTTP 服务器。你肯定不想在一个应用程序中做两次,除非你在不同的端口上服务(我不想这样做)?

同样,KeystoneJS docs

If you need to provide your own custom middleware for your system you can create a custom App and include it in your exported apps.

class CustomApp {
  prepareMiddleware({ keystone, dev, distDir }) {
    const middleware = express();
    // ...
    return middleware;
  }
}

这里,他们再次调用 express()

当您调用express()时究竟发生了什么?根据文档,它会启动一个新的 Express 应用程序,但我一直认为这等同于启动一个新服务器。当然,我想,你不能在同一个端口上启动两个服务器。

感谢您帮我解惑 -- 我显然只见树木不见森林。

express()基本上只是创建了一堆中间件函数。它本身不是服务器。

因为它只是一堆中间件,一个 Express 应用程序可以 'mounted' 到另一个应用程序中。 An example is shown here(为简洁起见进行了编辑):

var sub2 = express();
sub2.get("/", (req, res) => { res.json({}); });

var app = express();
app.use("/foo", sub2);

定义和use()创建一个新的 Express 实例实际上与加载任何其他中间件堆栈没有什么不同,例如express.Router()

至于绑定到端口,通常,您只会在最上面的 Express 应用程序实例上调用 listen() 辅助函数。这一切所做的只是设置一个基本的 HTTP 服务器(因此您不必这样做)并将您的 Express 实例注册为回调。这与 http.createServer(options, myUpperMostExpressApp);.

没什么不同