Можете ли вы вызывать "express ()" более одного раза в приложении ExpressJS? (Или: что именно делает "express ()"?) - PullRequest
1 голос
/ 09 марта 2020

Я уже некоторое время пользуюсь Express, но внезапно я не уверен в чем-то довольно простом c -

Я пытаюсь добавить пользовательское промежуточное ПО в приложение Keystone JS - в частности, я добавляю конечную точку токена 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;
}

This Все это вызывается из приложения Keystone JS, на котором работает собственный сервер ExpressJS. Что именно делает звонок в express() выше? Документы API ExpressJS скажем

**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-сервера. Конечно, вы не хотите делать это дважды в одном приложении, если только вы не обслуживаете разные порты (что я не пытаюсь сделать)?

Аналогично, Keystone JS документы скажем

Если вам необходимо предоставить собственное промежуточное программное обеспечение для вашей системы, вы можете создать собственное приложение и включить его в свои экспортируемые приложения.

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

Здесь опять звонят express().

Что именно происходит, когда вы звоните express()? Согласно документам, он запускает новое приложение Express, но я всегда думал, что это эквивалентно запуску нового сервера. Конечно, я думал, что вы не можете запустить два сервера на одном и том же порту.

Спасибо за помощь в прояснении моего замешательства - я явно не вижу леса за деревьями.

1 Ответ

2 голосов
/ 09 марта 2020

express() в основном просто создает стек функций промежуточного программного обеспечения. Это не сервер сам по себе.

Поскольку это просто стек промежуточного программного обеспечения, приложение Express может быть «подключено» к другому приложению. Пример показан здесь (отредактировано для краткости):

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

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

Определение и use() создание нового Express экземпляра действительно ничем не отличается от загрузки любого другого промежуточного программного обеспечения стек , например express.Router().

Что касается привязки к портам, обычно вы вызываете вспомогательную функцию listen() только в самой верхней Express экземпляр приложения. Все, что для этого нужно - настроить базовый HTTP-сервер c (так что вам не нужно) и зарегистрировать ваш экземпляр Express в качестве обратного вызова. Это немного отличается от http.createServer(options, myUpperMostExpressApp);.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...