Как получить доступ к ответу в koa.js - PullRequest
0 голосов
/ 14 января 2019

Я хочу переписать длинный опрос (например, здесь ), используя koa.js. Но я столкнулся с проблемой:

const app = new Koa();
const router = new Router();

router.get('/', homePage)
.get('/subscribe', subscribe)
.post('/publish', publish)

app
.use(router.routes())
.listen(3000);

Я не могу получить доступ к ctx.response в следующей части кода. Мне нужно это для передачи объекта в массив клиентов, а затем для вызова response.end () в методе publish ( узел js версия )

subscribe = (ctx, next) => {
  clients.push(ctx.res);
  ctx.res.on('close', () => {
    clients.splice(clients.indexOf(response), 1);
  });
};

1 Ответ

0 голосов
/ 14 января 2019

Промежуточные программы Коа (и маршруты) работают с обещаниями. Если обещание разрешается, маршрут считается выполненным, и ответ отправляется клиенту.

Если вы не вернули обещание (или не использовали асинхронную функцию), считается, что промежуточное программное обеспечение выполняется и завершается немедленно. Когда вы звоните ctx.res.end(), это в основном слишком поздно.

Так, как вы говорите коа не автоматически завершать запрос? Вы можете сделать это, отправив обещание, которое разрешается позже.

Вот пример промежуточного программного обеспечения, которое отправляет обещание, которое никогда не разрешается:

const myMw = ctx => {
  return new Promise( () => {});
}

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

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

...