Чем промежуточное программное обеспечение koa отличается от промежуточного программного обеспечения Express? - PullRequest
0 голосов
/ 29 октября 2018

За исключением очевидных async/await и сигнатур промежуточного программного обеспечения, промежуточное программное обеспечение Коа app.use(async (ctx, next) => {...}) против экспресс app.use(function (req, res, next) {...})

Каким образом промежуточное программное обеспечение Коа будет иметь значение? Почему это назвали бы луковая модель ?

------ обновление ------

Мой оригинальный вопрос, вероятно, был недостаточно ясен. Мне было интересно, почему промежуточное ПО koa лучше, чем промежуточное программное обеспечение Express?

------ обновление 2 ------

Как Освоение Koa Middleware объяснил, что обработка ошибок действительно лучше в koa.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Ну, в коайсе есть возможность каскадного промежуточного программного обеспечения:

Пример со страницы Коа гласит:

// logger

app.use(async (ctx, next) => {
  await next();
  const rt = ctx.response.get('X-Response-Time');
  console.log(`${ctx.method} ${ctx.url} - ${rt}`);
});

// x-response-time

app.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const ms = Date.now() - start;
  ctx.set('X-Response-Time', `${ms}ms`);
});

// response

app.use(async ctx => {
  ctx.body = 'Hello World';
});

По сравнению с экспресс-потоком приведенный выше код будет:

  1. Logger промежуточное ПО приостановит выполнение собственного кода и продолжит работу до x-response-time промежуточного программного обеспечения,

  2. x-response-time будет определять время, затем приостанавливать выполнение кода и ручное управление следующим промежуточным программным обеспечением (response),

  3. Следующее промежуточное ПО - response, оно установит ответ в тело, затем раскрутить выполнение кода обратно к x-response-time

  4. x-response-time продолжит выполнение кода с того места, где он оставил выключите и рассчитайте время, необходимое для установки ответа, затем раскрутите выполнение кода обратно к logger middleware

  5. Logger промежуточное ПО будет регистрировать время response.

Учитывая приведенный выше пример, вы можете использовать это в своих интересах. Первое промежуточное программное обеспечение (logger) можно заменить на другое, которое перехватывает исключения, так что оно обернет все следующие промежуточные программы в блок try catch

0 голосов
/ 29 октября 2018

Express next вызывается в конце вызова промежуточного программного обеспечения и передает управление следующему промежуточному программному обеспечению. Предыдущее промежуточное ПО не знает, как выполняется следующее промежуточное ПО. Промежуточное программное обеспечение может взаимодействовать одним способом, последнее промежуточное программное обеспечение обычно отвечает за отправку запроса.

Как объясняет документация Koa 2 , next() возвращает результат следующего промежуточного программного обеспечения в стеке, то есть обещание:

app.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const ms = Date.now() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});

Промежуточное ПО Koa может взаимодействовать двумя способами: нет необходимости, чтобы последнее промежуточное ПО в стеке отправляло ответ, назначение ответа можно было делегировать предыдущему промежуточному ПО. Поскольку ответ не отправляется явно, как res.send(), но после завершения выполнения стека промежуточного программного обеспечения, его можно изменить в других промежуточных программах (это можно использовать как хорошее, так и плохое):

app.use(function thirdPartyMiddlewareWeCannotChange(ctx, next) {
  if (!auth)
    ctx.redirect('/login');

  next();
});

app.use(router.routes());

router.get('/no-auth-here', (ctx) => {
  ctx.status = 200;
  ctx.body = 'hi';
});
...