使用sqs-consumer监听SQS队列时出现this.sqs.send不是函数错误
问题排查:sqs-consumer 报错
SQSError: SQS receive message failed: this.sqs.send is not a function 我基于sqs-consumer库实现了SQS队列监听代码,单独的SQS消息接收代码可正常运行,但执行consumer.js时触发错误:SQSError: SQS receive message failed: this.sqs.send is not a function。当前环境为Node.js 18.19.0,依赖版本为aws-sdk ^2.1534.0、sqs-consumer ^8.1.3,相关代码及报错栈信息如下:
相关代码
const AWS = require("aws-sdk"); const { Consumer } = require("sqs-consumer"); require("dotenv").config({ path: "./../../.env" }); //aws configuration AWS.config.update({ secretAccessKey: "aws-secret-key", accessKeyId: "access-key", region: "us-east-1", }); const sqs = new AWS.SQS({ apiVersion: "2012-11-05" }); const accountId = process.env.AWS_ACCOUNT_ID; const sqsPath = process.env.SQS_PATH; const queueName = process.env.EXPORTLOCATIONLIST_QUEUE_NAME; const QueueUrl = `${sqsPath}/${accountId}/${queueName}`; const subscribe = (QueueUrl, batchSpace, visibilityTimeout) => { const consumer = Consumer.create({ queueUrl: QueueUrl, batchSize: batchSpace || 1, visibilityTimeout: visibilityTimeout || undefined, attributeNames: ["All"], handleMessage: async (message) => { console.log(message); }, sqs: sqs, }); consumer.start() return consumer }; subscribe(QueueUrl); module.exports = { subscribe, };
报错信息
D:\Samplify\runner_backend\task\node_modules\sqs-consumer\dist\errors.js:47 const sqsError = new SQSError(message); ^ SQSError: SQS receive message failed: this.sqs.send is not a function at toSQSError (D:\Samplify\runner_backend\task\node_modules\sqs-consumer\dist\errors.js:47:22) at Consumer.receiveMessage (D:\Samplify\runner_backend\task\node_modules\sqs-consumer\dist\consumer.js:190:43) at Consumer.poll (D:\Samplify\runner_backend\task\node_modules\sqs-consumer\dist\consumer.js:144:14) at Consumer.start (D:\Samplify\runner_backend\task\node_modules\sqs-consumer\dist\consumer.js:62:18) at subscribe (D:\Samplify\runner_backend\task\src\listeners\queue_listener.js:32:12) at Object.<anonymous> (D:\Samplify\runner_backend\task\src\listeners\queue_listener.js:38:1) at Module._compile (node:internal/modules/cjs/loader:1356:14) at Module._extensions..js (node:internal/modules/cjs/loader:1414:10) at Module.load (node:internal/modules/cjs/loader:1197:32) at Module._load (node:internal/modules/cjs/loader:1013:12) Emitted 'error' event on Consumer instance at: at Consumer.emit (D:\Samplify\runner_backend\task\node_modules\sqs-consumer\dist\emitter.js:29:22) at Consumer.emitError (D:\Samplify\runner_backend\task\node_modules\sqs-consumer\dist\consumer.js:120:18) at D:\Samplify\runner_backend\task\node_modules\sqs-consumer\dist\consumer.js:170:18 at process.processTicksAndRejections (node:internal/process/task_queues:95:5) { code: 'TypeError', statusCode: undefined, retryable: undefined, service: undefined, fault: undefined, time: 2024-01-15T07:44:44.810Z }
错误原因
sqs-consumer v8.x版本起仅支持AWS SDK v3,而你当前使用的是AWS SDK v2,两者API结构不兼容:AWS SDK v2的SQS实例没有.send()方法(v2使用.receiveMessage()这类直接方法),但sqs-consumer v8.x内部调用的是v3的.send()接口,因此触发该错误。
解决方法
有两种可选方案:
方案1:降级sqs-consumer到兼容AWS SDK v2的版本
sqs-consumer v7.x及以下版本支持AWS SDK v2,修改package.json中的依赖版本:
"sqs-consumer": "^7.2.0"
然后重新安装依赖:
npm install
无需修改现有代码,保持AWS SDK v2的用法即可。
方案2:升级到AWS SDK v3
若要保留sqs-consumer v8.x,需切换到AWS SDK v3,修改代码如下:
const { SQSClient } = require("@aws-sdk/client-sqs"); const { Consumer } = require("sqs-consumer"); require("dotenv").config({ path: "./../../.env" }); // 初始化SQS Client(AWS SDK v3用法) const sqs = new SQSClient({ credentials: { secretAccessKey: "aws-secret-key", accessKeyId: "access-key", }, region: "us-east-1", }); const accountId = process.env.AWS_ACCOUNT_ID; const sqsPath = process.env.SQS_PATH; const queueName = process.env.EXPORTLOCATIONLIST_QUEUE_NAME; const QueueUrl = `${sqsPath}/${accountId}/${queueName}`; const subscribe = (QueueUrl, batchSpace, visibilityTimeout) => { const consumer = Consumer.create({ queueUrl: QueueUrl, batchSize: batchSpace || 1, visibilityTimeout: visibilityTimeout || undefined, attributeNames: ["All"], handleMessage: async (message) => { console.log(message); }, sqs: sqs, // 传入v3的SQSClient实例 }); consumer.start(); return consumer; }; subscribe(QueueUrl); module.exports = { subscribe, };
同时安装AWS SDK v3的SQS包:
npm install @aws-sdk/client-sqs
内容的提问来源于stack exchange,提问作者Vishal Bindal
相关产品推荐
相关产品推荐

