如何使用koa生成慢响应?

问题描述 投票:1回答:1

运行koa时,我收到以下警告:

不推荐使用v3中将删除对生成器的支持

我的代码所做的是创建一个缓慢的响应。例如。每1秒写入一次响应,持续30秒。

(new Koa()).use(function *(){
  const tr = through();
  setInterval(() => tr.write('blabla\n'), 1000);
  setTimeout(tr.end, 30000);
  this.type = 'text';
  this.body = tr;
}).listen(3003, () => console.log('Listen 3003: slow response'));
curl http://localhost:3003

HTTP / 1.1 200好的 内容类型:text / plain;字符集= utf-8的 日期:2019年2月27日星期三,格林尼治标准时间21:17:06 连接:保持活力 转移编码:分块

胡说 胡说 胡说 胡说 ...

注意:消息是逐个打印的。

如何使用v3方式实现上述目的?

node.js koa nodejs-stream
1个回答
1
投票

为了清楚起见,v3没有出来,这只是一个弃用警告,Koa正在远离发电机功能。你没有使用yield所以它很容易转换它:

const Koa = require('koa');
const through = require('through');

(new Koa()).use((ctx) => {
  const tr = through();
  setInterval(() => tr.write('blabla\n'), 1000);
  setTimeout(tr.end, 30000);
  ctx.type = 'text';
  ctx.body = tr;
}).listen(3003, () => console.log('Listen 3003: slow response'));
  1. 用常规函数或箭头函数替换生成器函数,它具有参数ctx
  2. this替换ctx

编辑:另外,我相信这段代码存在错误。您正在为每个请求创建一个新的间隔,但从不清除它们。我认为这将被视为内存泄漏。

你应该做更像这样的事情:

const Koa = require('koa');
const through = require('through');

(new Koa()).use((ctx) => {
  const tr = through();
  let intervalId = setInterval(() => tr.write('blabla\n'), 1000);
  setTimeout(end(intervalId, tr), 30000);
  ctx.type = 'text';
  ctx.body = tr;
}).listen(3003, () => console.log('Listen 3003: slow response'));

function end(intervalId, tr) {
  return () => {
    clearInterval(intervalId);
    tr.end();
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.