如何模拟返回套接字的Kubernetes API端点?

wtlkbnrh  于 2022-11-28  发布在  Kubernetes
关注(0)|答案(1)|浏览(120)

我在一个模拟服务器中模拟Kubernetes API的一些端点进行一些集成测试,并在端点/apis/batch/v1/watch/namespaces/{namespace}/jobs?watch=true(doc,需要在页面中搜索batch/v1/watch)的实现中卡住了。客户端使用此方法发出GET请求,并保持连接打开以接收与作业资源相关的事件。显然,它处理一个'socket'事件。
我实现了一个简单的mock端点,它返回了我想要的数据,但是在发出请求时,我得到了这个错误:

Error: socket hang up
    at connResetException (node:internal/errors:691:14)
    at Socket.socketOnEnd (node:_http_client:466:23)
    at Socket.emit (node:events:538:35)
    at endReadableNT (node:internal/streams/readable:1345:12)
    at processTicksAndRejections (node:internal/process/task_queues:83:21)

这个mock应该如何实现?我需要返回一个套接字吗?我应该如何做?

u7up0aaq

u7up0aaq1#

回答我自己的问题:尝试了几次之后,我所需要做的就是使用res.write()和一个以换行符结尾的字符串,如下所示:

import express from 'express';

const TIME_BETWEEN_EVENTS = 500; // Milliseconds
const app = express();

app.get('/apis/batch/v1/watch/namespaces/:namespace/jobs', (_, res) => {
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    Connection: 'keep-alive',
  });

  console.log('Client connected to Jobs watch endpoint');
  let jobEventsSent = 0;

  const interval = setInterval(() => {
    if (jobEventsSent < 3) {
      console.log('Sending data to Jobs watcher');
      res.write(
        Buffer.from(JSON.stringify({ type: 'ADDED', object: { /* Job Resource */ } }) + '\n'),
      );
      jobEventsSent++;
    } else {
      clearInterval(interval)
    }
  }, TIME_BETWEEN_EVENTS);

  res.socket.on('close', () => {
    console.log('Client disconnected from Jobs watch endpoint');
    if (interval) clearInterval(interval);
  });
});

上面的代码在所有消息发送完后保持连接活动事件,要关闭连接需要调用res.end();

相关问题