You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS用@ssut/nestjs-sqs部署GitLab CI/CD时SQS消费者报错

问题

我有一个基于NestJS的服务,使用@ssut/nestjs-sqs搭建SQS消费者,本地运行完全正常,但通过GitLab CI/CD部署时出现以下错误日志:

[Nest] 1  - 10/05/2023, 12:25:13 PM    WARN [SqsService] No metadata found for: 


/usr/src/app/node_modules/@ssut/nestjs-sqs/dist/sqs.service.js:64
                const isBatchHandler = metadata.meta.batch === true;
TypeError: Cannot read properties of undefined (reading 'meta')
    at /usr/src/app/node_modules/@ssut/nestjs-sqs/dist/sqs.service.js:64:49
    at Array.forEach (<anonymous>)
    at SqsService.<anonymous> (/usr/src/app/node_modules/@ssut/nestjs-sqs/dist/sqs.service.js:55:83)
    at Generator.next (<anonymous>)
    at fulfilled (/usr/src/app/node_modules/@ssut/nestjs-sqs/dist/sqs.service.js:17:58)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)

消费者代码如下:

import { Injectable } from '@nestjs/common';
import { SqsConsumerEventHandler, SqsMessageHandler } from '@ssut/nestjs-sqs';
import * as AWS from 'aws-sdk';

@Injectable()
export class SQSService {
  constructor() {}
  @SqsMessageHandler('my_sqs_name', true)
  handleMessage(message: AWS.SQS.Message) {
    if (message[0].Body) {
      const body = JSON.parse(message[0].Body);

      const { issueId, salesChannel, date, issueName, user } = body[0];
      console.log({ message });

      console.log(`Mensaje de issue "${issueName}" recibido con éxito`);
    } else {
      console.log('No hay mensaje');
    }
    // Here i will consume data //
  }
  @SqsConsumerEventHandler('my_sqs_name', 'processing_error')
  public onProcessingError(error: Error, message: AWS.SQS.Message) {
    console.log(error, message);
  }
}

已配置所有环境变量,请问问题出在哪里?

问题排查与解决

1. 构建时元数据丢失(最可能原因)

@ssut/nestjs-sqs依赖装饰器元数据识别消费者配置,GitLab CI/CD的生产构建可能存在以下情况:

  • 检查tsconfig.json,确保emitDecoratorMetadata和experimentalDecorators均设为true,且生产构建未覆盖该配置;
  • 确认nest build命令未添加禁用元数据生成的额外参数。

2. 队列名称配置不一致

本地与部署环境的队列名称可能存在差异:

  • 打印部署时的队列名称,确认'my_sqs_name'是否正确读取环境变量(建议将硬编码改为环境变量注入);
  • 检查SQS模块注册时的队列配置,确保与装饰器中指定的名称完全一致。

3. 依赖版本不匹配

本地与CI环境的@ssut/nestjs-sqs或NestJS版本可能不一致:

  • 锁定依赖版本(通过package-lock.json或yarn.lock),确保CI构建使用与本地完全相同的依赖版本;
  • 尝试升级@ssut/nestjs-sqs到最新稳定版,该错误可能是旧版本的已知bug。

4. 装饰器参数类型错误

@SqsMessageHandler第二个参数设为true(批量处理)时,方法参数应为数组类型,当前代码中参数message: AWS.SQS.Message是单个消息类型,类型不匹配会导致元数据解析异常,修正如下:

@SqsMessageHandler('my_sqs_name', true)
handleMessage(messages: AWS.SQS.Message[]) {
  messages.forEach(msg => {
    if (msg.Body) {
      const body = JSON.parse(msg.Body);
      const { issueId, salesChannel, date, issueName, user } = body[0];
      console.log({ msg });
      console.log(`Mensaje de issue "${issueName}" recibido con éxito`);
    } else {
      console.log('No hay mensaje');
    }
  });
}

内容的提问来源于stack exchange,提问作者HerAraujo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:42:47