Я хочу переписать чат с длинным опросом (например, здесь), используя 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 () в методе публикации (версия узла js)
subscribe = (ctx, next) => {
clients.push(ctx.res);
ctx.res.on('close', () => {
clients.splice(clients.indexOf(response), 1);
});
};





Промежуточное ПО (и маршруты) Koa работают с обещаниями. Если обещание разрешается, маршрут считается выполненным, и клиенту отправляется ответ.
Если вы не вернули обещание (или использовали асинхронную функцию), промежуточное ПО считается выполненным и немедленно завершается. Когда вы звоните в ctx.res.end(), уже поздно.
Так как же сказать Коа, чтобы она не завершала запрос автоматически? Вы можете сделать это, отправив обещание, которое разрешится позже.
Вот пример промежуточного программного обеспечения, которое отправляет обещание, которое никогда не выполняется:
const myMw = ctx => {
return new Promise( () => {});
}
Учитывая, что вы переходите с экспресса на коа (отличный выбор!), Вам не следует пытаться точно перенять те же шаблоны, что и у экспресса. Длинный опрос действительно хорошо подходит для решения, основанного на обещании.
Я очень рекомендую вам использовать обещания для всего. Если клиент «публикует» сообщение для каждого другого клиента, это должно привести к выполнению множества обещаний.