我可以在node.js中指定RabbitMQ凭证吗?

问题描述 投票:0回答:6

我开始使用rabbit.js从node.js应用程序连接到RabbitMQ。

我被阻止在:

错误:服务器关闭通道:403(ACCESS-REFUSED),消息“ACCESS_REFUSED - 默认交换上不允许操作”
在 Channel.C.accept (/.../rabbit.js/node_modules/amqplib/lib/channel.js:398:24)
在 Connection.mainAccept [作为接受] (/.../rabbit.js/node_modules/amqplib/lib/connection.js:63:33)
在 Socket.go (/.../rabbit.js/node_modules/amqplib/lib/connection.js:448:48)
在 Socket.EventEmitter.emit (events.js:92:17)
...

这是预期的,因为我使用的 RabbitMQ 实例被配置为要求发布者和订阅者提供凭据才能使用消息队列,并且来宾帐户被禁用。

rabbit.js的官方文档没有提及凭证。 Google 搜索“rabbit.js 指定凭据”和“rabbit.js 登录密码”没有结果。

rabbit.js 支持凭证吗?如果没有,node.js 的其他 RabbitMQ 客户端支持它们吗?

node.js rabbitmq
6个回答
75
投票

所以我自己从来没有使用过rabbit.js,但是在深入研究代码后,它似乎在使用amqplib。解析它的代码可以在here看到,它似乎正在调用标准的nodejsURL模块。所以也许你可以尝试一些这样的:

amqp://user:[email protected]/vhost

希望有帮助!

干杯。


21
投票
const amqp = require('amqplib/callback_api');

const opt = { credentials: require('amqplib').credentials.plain('user', 'password') };
amqp.connect('amqp://localhost', opt, (err, conn) => {});

//

12
投票

RabbitMQ 遵循 WHATWG URL 标准,即它需要:

amqp://user:[email protected]:8080

地点:

  • 用户:用户名
  • pass:密码
  • sub.example.com:8080:主机:PORT

示例代码:

var amqp = require('amqplib/callback_api');

amqp.connect('amqp://example.username:example.password@localhost', (err, conn) => {});

问候


2
投票

密码中包含“@”会导致问题(也可能存在其他此类字符),因此,按照 @snakemw 的建议,credentials.plain 方法更好

const opt = { credentials: require('amqplib').credentials.plain('user', 'password') };

0
投票

现在可以使用对象而不是 URL 连接到 RabbitMQ:

{
  protocol: 'amqp',
  hostname: 'localhost',
  port: 5672,
  username: 'guest',
  password: 'guest',
  locale: 'en_US',
  frameMax: 0,
  heartbeat: 0,
  vhost: '/',
}

对于以字符串形式提供的 URL,将为缺少的字段提供默认值(根据文档)。


0
投票

让我们看看连接功能是如何构建的:

export function connect(url: string | Options.Connect, socketOptions?: any): Promise<Connection>;

如前所述,您可以直接使用网址,例如:

amqp://user:[email protected]:8080

另一种选择是使用

Options.Connect

const connect = {
    hostname: 'example.com',
    port: 8080,
    username: 'user',
    password: 'pass'
};

您还可以更改

protocol
(默认值“amqp”)、
locale
(默认值“en_US”)、
frameMax
(默认值 4kb)、
heartbeat
(默认值 0)和
vhost
(默认值“/”)。

TLDR

const hostname = 'example.com';
const port = 8080;
const username = 'user';
const password = 'pass';

// Option 1
const url = `amqp://${username}:${password}@${hostname}:${port}`;
await amqplib.connect(url);

// Option 2
const connect = {
    hostname: hostname,
    port: port,
    username: username,
    password: password
};
await amqplib.connect(connect);
© www.soinside.com 2019 - 2024. All rights reserved.