Передать значение из промежуточного программного обеспечения для просмотра в Koa 2

Я пытаюсь получить значение var из моего промежуточного программного обеспечения Koa 2 для отображения в моем шаблоне pug (или другом). Например, в коа-сессиях у меня есть:

app.use(ctx => {
  // ignore favicon
  if (ctx.path === '/favicon.ico') return;

  let n = ctx.session.views || 0;
  ctx.session.views = ++n; // how can I use this?
  ctx.body = n + ' views'; // works, but in body directly
  ctx.state.views = n + ' views'; // not working
});

Другой пример со временем отклика:

app.use(async (ctx, next) => {
  const start = Date.now();
  ctx.state.start = start
  await next();
  const ms = Date.now() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`); // this shows response
  ctx.state.ms = await ms>0 // I have no idea what I'm doing :)
});

В соответствии с оригинальной инструкцией это работает, но вместо использования тела/консоли я хотел бы использовать его как переменную шаблона, поэтому в моем маршрутизаторе/контроллере у меня было бы:

...
return ctx.render("posts/index", {
  title: 'Posts',
  posts: posts,
  ms: ctx.state.ms,
  views: ctx.session.views // or views: ctx.state.views
});

Ничего из этого не работает. Это связано с асинхронностью/ожиданием, поэтому оно не получает значение вовремя или это какая-то синтаксическая проблема? Пожалуйста, будьте нежны, так как я новичок в этом. :)


person Encho    schedule 27.09.2017    source источник


Ответы (1)


Вам нужно вызвать next() в промежуточном программном обеспечении "сеанса", так же, как в примере "время отклика".

Как это:

app.use((ctx, next) => {
 let n = ctx.session.views || 0;
  ctx.session.views = ++n;
  next();
});

app.use(ctx => {
  ctx.body = 'Hello ' + ctx.session.views;
  // or you can return rendering result here
});

Дополнительные сведения см. в разделе Каскадирование их документации.

person Oles Savluk    schedule 27.09.2017
comment
Спасибо, хотя мой вывод console.log несколько отличается от переданного здесь результата. Ну, я думаю, что это достаточно хорошо :) - person Encho; 03.10.2017
comment
В моем ответе нет console.log :) Или что вы имеете в виду? Что вы ожидали увидеть и каков фактический вывод вашего console.log? - person Oles Savluk; 03.10.2017
comment
Извините, я недостаточно ясно выразился - я использовал ваш ответ и преобразовывал код для моей переменной скорости загрузки страницы в соответствии с вторым примером в вопросе. console.log(${ctx.method} ${ctx.url} - ${ms}ms); дает результаты, отличные от того, что я вывел на странице. - person Encho; 04.10.2017
comment
Я предполагаю, что это потому, что переменная ms объявлена ​​после вызова next(), это означает, что вы вычисляете и печатаете время после того, как страница была отрисована, и поэтому они разные. - person Oles Savluk; 04.10.2017