如何使用koa产生较慢的响应?

时间:2019-02-27 21:25:46

标签: node.js koa nodejs-stream

运行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确定
内容类型:文本/纯文本; charset = utf-8
日期:2019年2月27日星期三21:17:06 GMT
连接:保持活动状态
传输编码:分块

blabla
blabla
blabla
blabla
...

注意:消息是一一打印的。

如何使用v3方法实现以上目标?

1 个答案:

答案 0 :(得分: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. 的常规函数​​或箭头函数
  3. 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();
  }
}