SubscribeToShard 命令的异常

问题描述

我正在尝试从 Kinesis Shard 订阅事件。 但是 SubscribetoShardCommand 的执行挂起 5 分钟(订阅超时)然后抛出错误

(node:2667) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token  in JSON at position 0
    at JSON.parse (<anonymous>)
    at /home/mjpolak/Documents/company/project/node_modules/@aws-sdk/client-kinesis/protocols/Aws_json1_1.ts:4020:19
    at processticksAndRejections (internal/process/task_queues.js:88:5)
    at Object.deserializeAws_json1_1SubscribetoShardCommand (/home/mjpolak/Documents/company/project/node_modules/@aws-sdk/client-kinesis/protocols/Aws_json1_1.ts:2583:21)
    at /home/mjpolak/Documents/company/project/node_modules/@aws-sdk/middleware-serde/src/deserializerMiddleware.ts:20:18
    at /home/mjpolak/Documents/company/project/node_modules/@aws-sdk/middleware-signing/src/middleware.ts:26:22
    at StandardRetryStrategy.retry (/home/mjpolak/Documents/company/project/node_modules/@aws-sdk/middleware-retry/src/defaultStrategy.ts:125:38)
    at /home/mjpolak/Documents/company/project/node_modules/@aws-sdk/middleware-logger/src/loggerMiddleware.ts:21:20
    at /home/mjpolak/Documents/company/project/kinesis-subscribe.ts:85:29

我正在寻求帮助以成功订阅

完整代码

const { StreamDescription } = await client.send(
        new DescribeStreamCommand({
            StreamName: 'streamName',}),);
    const { StreamARN } = StreamDescription;

    const { Consumers } = await client.send(
        new ListStreamConsumersCommand({
            StreamARN,);

    let Consumer = Consumers.find((x) => x.ConsumerName == 'tester');

    if (Consumer == null) {
        const consumerData = await client.send(
            new RegisterStreamConsumerCommand({
                ConsumerName: 'tester',StreamARN,);
        Consumer = consumerData.Consumer;
    }

    console.log(`StreaARM: ${StreamARN}`);

    console.log(`Consumer: ${Consumer.ConsumerARN}`);

    const { EventStream } = await client.send(
        new SubscribetoShardCommand({
            ConsumerARN: Consumer.ConsumerARN,ShardId: 'shardId-000000000000',StartingPosition: {
                Type: 'LATEST'
            },);
    console.log("Consuming");

通过调查 Wireshark 的通信,我可以确认 HTTP 连接已建立,并且 AWS 向我的客户端推送了一些数据。因此,我猜测客户端库中存在某种错误,即保留块而不是返回结果。

我还在 SDK 存储库上创建了错误https://github.com/aws/aws-sdk-js-v3/issues/2418

解决方法

日志显示 JSON 解析出错,当您收到 HTML 或 XML 格式的响应但预期是 JSON 响应时会发生这种情况。尝试在控制台上记录响应,看看它的格式是否正确。