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

NestJS集成@ssut/nestjs-sqs遇TypeError: 无法读取undefined的'meta'属性

Nest.js集成@ssut/nestjs-sqs报错:No metadata found for: undefined及TypeError分析与解决

错误日志

[Nest] 59296  - 07/25/2023, 3:28:42 PM    WARN [SqsService] No metadata found for: undefined

/Users/avinash.anshu/Project/Josys/smithereens/node_modules/@ssut/nestjs-sqs/dist/sqs.service.js:55
            (_b = this.options.consumers) === null || _b === void 0 ? void 0 : _b.forEach((options) => {
                                                                                  ^
TypeError: Cannot read properties of undefined (reading 'meta')
    at /Users/avinash.anshu/Project/Josys/smithereens/node_modules/@ssut/nestjs-sqs/dist/sqs.service.js:64:49
    at Array.forEach (<anonymous>)
    at SqsService.<anonymous> (/Users/avinash.anshu/Project/Josys/smithereens/node_modules/@ssut/nestjs-sqs/dist/sqs.service.js:55:83)
    at Generator.next (<anonymous>)
    at fulfilled (/Users/avinash.anshu/Project/Josys/smithereens/node_modules/@ssut/nestjs-sqs/dist/sqs.service.js:17:58)

当前模块代码(/src/global/sqs/sqs.module.ts)

import { Module } from '@nestjs/common';
import { SqsModule } from '@ssut/nestjs-sqs';
import { ConfigModule, ConfigService } from '@nestjs/config';
import * as AWS from 'aws-sdk';
import { SQSListenerService } from './services/sqs-listener.service';

interface SqsConfig {
  consumers: any[]; // Change this based on SqsConsumerOptions from @ssut/nestjs-sqs
  producers: any[]; // Replace any with the actual type of producers
}

@Module({
  imports: [
    SqsModule.registerAsync({
      imports: [ConfigModule],
      useFactory: async (configService: ConfigService): Promise<SqsConfig> => {
        AWS.config.update({
          region: configService.get('AWS.REGION'),
          sslEnabled: false,
          accessKeyId: configService.get('AWS.access_key_id') + '',
          secretAccessKey: configService.get('aws.secret_access_key'),
        });
        return {
          consumers: [
            {
              name: 'FEATURE_QUEUE', // name of the queue
              queueUrl: configService.get('AWS.SQS.QUEUE_URL'), // the url of the queue
              region: configService.get('AWS.REGION'),
            },
          ],
          producers: [],
        };
      },
      inject: [ConfigService],
    }),
],
  providers: [SQSListenerService]
})
export class SqsListenerModule {}

原因分析

  1. 消费者配置缺失处理器关联:@ssut/nestjs-sqs要求每个consumer必须指定对应的消息处理服务(即使用@SqsConsumer装饰器的类),否则库无法找到对应的元数据,进而在读取meta属性时抛出TypeError。
  2. 类型定义不规范:自定义的SqsConfig使用any[]类型,没有遵循库提供的SqsConsumerOptions类型约束,容易遗漏必填配置项。

解决思路

1. 完善消费者配置,绑定处理器

在consumer配置中添加processor字段,关联你的SQSListenerService:

// 修改后的consumer配置
consumers: [
  {
    name: 'FEATURE_QUEUE',
    queueUrl: configService.get('AWS.SQS.QUEUE_URL'),
    region: configService.get('AWS.REGION'),
    processor: SQSListenerService, // 新增:绑定消息处理服务
  },
],

2. 修正类型定义,使用库提供的类型

替换自定义的SqsConfig为库的SqsModuleOptions类型,避免类型不匹配:

// 导入库的类型
import { SqsModuleOptions } from '@ssut/nestjs-sqs';

// 替换useFactory的返回类型
useFactory: async (configService: ConfigService): Promise<SqsModuleOptions> => {
  // ... 原有代码
}

3. 确保消息处理服务正确使用装饰器

在SQSListenerService中使用@SqsConsumer装饰器,且name与模块配置的consumer name完全一致:

import { Injectable } from '@nestjs/common';
import { SqsConsumer, Message } from '@ssut/nestjs-sqs';

@Injectable()
@SqsConsumer({
  name: 'FEATURE_QUEUE', // 必须与模块中consumer的name一致
})
export class SQSListenerService {
  async handleMessage(message: Message) {
    // 实现消息处理逻辑
    console.log('收到消息:', message.Body);
  }
}

4. 优化AWS SDK配置方式

建议通过SqsModule的aws字段传入配置,而非全局更新AWS.config,更符合Nest模块化设计:

// 修改useFactory中的配置方式
return {
  consumers: [/* ... */],
  producers: [],
  aws: {
    region: configService.get('AWS.REGION'),
    sslEnabled: false,
    accessKeyId: configService.get('AWS.access_key_id'),
    secretAccessKey: configService.get('aws.secret_access_key'),
  },
};

集成技巧

  • 始终使用库提供的类型定义(如SqsModuleOptions、SqsConsumerOptions),避免any类型导致的配置遗漏。
  • 确保consumer的name与@SqsConsumer装饰器中的name完全一致,大小写敏感。
  • 本地开发可使用LocalStack模拟SQS服务,无需依赖AWS线上环境。
  • 若需要批量处理消息,可在consumer配置中添加batchSize字段,同时在处理方法中接收Message[]类型参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:08:09