Node.js SDK

轻量消息队列(原 MNS)Node.js SDK支持队列(queue)和主题(topic)模型的完整操作。

使用说明

安装 SDK

使用 npm 安装:

npm install @alicloud/mns --save

或使用 yarn 安装:

yarn add @alicloud/mns

初始化客户端

在代码中导入 SDK 并初始化客户端。需要设置您的账号 ID(accountid)、接入点(endpoint)、AccessKey ID 和 AccessKey Secret。

接入点信息可以在控制台的队列详情主题详情页面的接入点区域查看。

const MNSClient = require('@alicloud/mns');

const accountid = 'your-account-id';
const client = new MNSClient(accountid, {
  accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
  accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
  endpoint: "https://accountid.mns.regionId.aliyuncs.com"
});

示例代码

队列模型

本示例包括创建队列、发送消息、接收和删除消息、以及删除队列等操作。

const MNSClient = require('@alicloud/mns');

async function queueExample() {
  // 初始化客户端
  const client = new MNSClient('your-account-id', {
    accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
    accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
    endpoint: "https://accountid.mns.regionId.aliyuncs.com"
  });

  const queueName = 'test-queue';

  try {
    // 1. 创建队列
    const createRes = await client.createQueue(queueName, {
      DelaySeconds: 0,
      MaximumMessageSize: 65536,
      MessageRetentionPeriod: 345600,
      VisibilityTimeout: 30,
      PollingWaitSeconds: 0
    });
    console.log('队列创建成功:', createRes);

    // 等待 2 秒,确保队列创建完成
    await new Promise(resolve => setTimeout(resolve, 2000));

    // 2. 获取队列属性
    const attrRes = await client.getQueueAttributes(queueName);
    console.log('队列属性:', attrRes.body);

    // 3. 发送消息
    const sendRes = await client.sendMessage(queueName, {
      MessageBody: 'hello <"aliyun-mns-nodejs-sdk">',
      DelaySeconds: 0,
      Priority: 8
    });
    console.log('消息发送成功:', sendRes.body);

    // 4. 批量发送消息
    const batchMessages = [
      { MessageBody: 'message 1', Priority: 8 },
      { MessageBody: 'message 2', Priority: 16 },
      { MessageBody: 'message 3', DelaySeconds: 10 }
    ];
    const batchSendRes = await client.batchSendMessage(queueName, batchMessages);
    console.log('批量发送成功:', batchSendRes.body);

    // 5. 接收消息(长轮询 30 秒)
    const receiveRes = await client.receiveMessage(queueName, 30);
    console.log('接收到消息:', receiveRes.body);

    // 6. 修改消息可见性超时时间
    const receiptHandle = receiveRes.body.ReceiptHandle;
    const changeVisRes = await client.changeMessageVisibility(
      queueName,
      receiptHandle,
      60
    );
    console.log('消息可见性已修改:', changeVisRes.body);

    // 7. 删除消息
    const deleteRes = await client.deleteMessage(queueName, receiptHandle);
    console.log('消息已删除');

    // 8. 批量接收消息
    const batchReceiveRes = await client.batchReceiveMessage(queueName, 5, 30);
    console.log('批量接收到消息:', batchReceiveRes.body);

    // 9. 批量删除消息
    if (batchReceiveRes.body && batchReceiveRes.body.length > 0) {
      const receiptHandles = batchReceiveRes.body.map(msg => msg.ReceiptHandle);
      const batchDeleteRes = await client.batchDeleteMessage(queueName, receiptHandles);
      console.log('批量删除成功');
    }

    // 10. 查看队列列表
    const listRes = await client.listQueue();
    console.log('队列列表:', listRes.body);

    // 11. 删除队列
    await client.deleteQueue(queueName);
    console.log('队列已删除');

  } catch (err) {
    console.error('操作失败:', err);
  }
}

queueExample();

主题模型

本示例包括创建队列、创建主题、订阅主题和发布消息等操作。

const MNSClient = require('@alicloud/mns');

async function topicExample() {
  // 初始化客户端
  const client = new MNSClient('your-account-id', {
    accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
    accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
    endpoint: "https://accountid.mns.regionId.aliyuncs.com"
  });

  const queueName = 'test-queue';
  const topicName = 'test-topic';

  try {
    // 1. 创建队列用于接收推送的消息
    await client.createQueue(queueName);
    console.log('队列创建成功');

    // 2. 创建主题
    const topicRes = await client.createTopic(topicName, {
      MaximumMessageSize: 65536,
      LoggingEnabled: false
    });
    console.log('主题创建成功:', topicRes);

    // 等待 2 秒,确保资源创建完成
    await new Promise(resolve => setTimeout(resolve, 2000));

    // 3. 获取主题属性
    const attrRes = await client.getTopicAttributes(topicName);
    console.log('主题属性:', attrRes.body);

    // 4. 设置主题属性
    await client.setTopicAttributes(topicName, {
      MaximumMessageSize: 32768
    });
    console.log('主题属性已更新');

    // 5. 发布消息到主题
    const publishRes = await client.publishMessage(topicName, {
      MessageBody: 'hello topic <"aliyun-mns-nodejs-sdk">',
      MessageAttributes: JSON.stringify({
        key1: 'value1',
        key2: 'value2'
      })
    });
    console.log('消息发布成功:', publishRes.body);

    // 6. 从队列接收消息
    const receiveRes = await client.receiveMessage(queueName, 30);
    console.log('从队列接收到消息:', receiveRes.body);

    // 7. 删除消息
    if (receiveRes.body) {
      await client.deleteMessage(queueName, receiveRes.body.ReceiptHandle);
      console.log('消息已删除');
    }

    // 8. 查看主题列表
    const listRes = await client.listTopic();
    console.log('主题列表:', listRes.body);

    // 清理资源
    await client.deleteQueue(queueName);
    console.log('队列已删除');

  } catch (err) {
    console.error('操作失败:', err);
  }
}

topicExample();

版本记录

Version 1.1.0

更新日期

更新内容

2025-11-27

  • 支持自定义 endpoint 配置

  • 优化超时配置,支持独立设置读超时和连接超时
    改进错误处理机制