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
相关产品推荐
相关产品推荐

