我可以在浏览器中使用 amqplib 吗?
Can I use amqplib in the browser?
我是一个 AMQP/RabbitMQ 新手,而且是亲戚 Node.js 新手。我可以在客户端使用 amqplib NPM 库吗?
我希望能够从我的 Angular 应用程序将消息直接推送到 RabbitMQ。我使用 Browserify 模块化了很多客户端代码。我现在开始尝试使用 RabbitMQ,并希望通过 amqp 协议将消息直接从浏览器推送到基于云的队列。
我已经通过 NPM 安装了 amqplib 和 written/pasted 以下模块:
var amqp = require('amqplib/callback_api');
var push = function(){
console.log('This is the CORE queue.pusher push function being triggered');
var connString = 'amqp://username:pwd@blabla.rmq.cloudamqp.com/username';
amqp.connect(connString, function(err, conn) {
if (err){
console.log("core queue.pusher push error %s", err);
}else {
conn.createChannel(function (err, ch) {
var q = 'FatController';
var msg = 'Hello World!';
ch.assertQueue(q, {durable: false});
// Note: on Node 6 Buffer.from(msg) should be used
ch.sendToQueue(q, new Buffer(msg));
console.log(" [x] Sent %s", msg);
});
setTimeout(function () {
conn.close();
process.exit(0)
}, 500);
}
});
};
module.exports = {push:push};
当我尝试 运行 时,出现以下错误:
bundle.js:32074 TypeError: QS.unescape is not a function
at openFrames (bundle.js:9551)
at connect (bundle.js:9629)
at Object.connect (bundle.js:7959)
at Object.push (bundle.js:7652)
at controller.pushQueueEntry (bundle.js:7805)
at fn (eval at compile (bundle.js:32907), <anonymous>:4:184)
at callback (bundle.js:44543)
at Scope.$eval (bundle.js:35710)
at Scope.$apply (bundle.js:35810)
at HTMLInputElement.<anonymous> (bundle.js:44548)
at defaultHandlerWrapper (bundle.js:21283)
at HTMLInputElement.eventHandler (bundle.js:21271)
我是不是找错人了?在 'proper' 节点环境中,amqplib 只能 运行 吗?
作为次要问题,确定特定 NPM 包是否会 运行 在浏览器环境中的最佳方法是什么?在我看来,有些 NPM 包会 运行 在浏览器中,有些则不会 - 对此有信心的最佳方式是什么?
Will amqplib only run in a 'proper' node environment?
是的,恐怕是。
As a secondary question, what is the best way to determine whether a particular NPM package will run in the browser environment? It seems to me that some NPM packages will run in the browser, and some won't - what is the best way to be confident about this?
一个包是否可以 运行 在浏览器中并不总是很清楚,所以你必须应用一些启发式方法:
- 包是否需要设置 "plain" TCP 连接(即不用于 HTTP(S) 或 WebSockets 等通常的基于 Web 的协议的连接)?如果是这样,它可能是一个服务器端包。
- 包是否需要读取任意文件?如果是这样,可能是服务器端。
- 软件包是否提供或依赖原生 Node.js 插件?如果有,那就是服务端包。
- 作为这些的扩展:它是否使用
fs
、net
、cluster
、http
、https
、tls
、 dns
、os
、tty
还是 dgram
?很可能是服务器端。
可以在客户端使用的软件包通常在其文档中如此说明,因此如果没有特别提及,很可能只是在服务器端使用。
我有一段时间没有使用 Browserify,所以我不得不检查一下,但如果您传递给它的代码依赖于服务器端模块,它似乎不会警告您。它将创建一个包,该包在某些时候会因错误而失败,就像您运行正在做的那样。
Webpack,另一个常用的打包器,有一个部署目标的概念。默认情况下,它将针对浏览器,当您尝试捆绑依赖于服务器端模块的项目(如我上面提到的那些)时,您将收到错误消息:
$ webpack -p bundle.js
Hash: 767ace79fc17abef93e8
Version: webpack 2.6.1
Time: 3983ms
Asset Size Chunks Chunk Names
bundle.js 308 kB 0 [emitted] [big] main
[0] <SNIP>
ERROR in ./~/amqplib/lib/connect.js
Module not found: Error: Can't resolve 'net' in '/private/tmp/node_modules/amqplib/lib'
@ ./~/amqplib/lib/connect.js 152:11-25
@ ./~/amqplib/channel_api.js
@ ./test.js
ERROR in ./~/amqplib/lib/connect.js
Module not found: Error: Can't resolve 'tls' in '/private/tmp/node_modules/amqplib/lib'
@ ./~/amqplib/lib/connect.js 155:11-25
@ ./~/amqplib/channel_api.js
@ ./test.js
如您所见,我的测试文件使用了amqplib
,它依赖于net
和tls
,它们在浏览器环境中都不可用。所以如果你不确定一个包是否可以在浏览器中使用,Webpack 为你提供了一个安全网。
我是一个 AMQP/RabbitMQ 新手,而且是亲戚 Node.js 新手。我可以在客户端使用 amqplib NPM 库吗?
我希望能够从我的 Angular 应用程序将消息直接推送到 RabbitMQ。我使用 Browserify 模块化了很多客户端代码。我现在开始尝试使用 RabbitMQ,并希望通过 amqp 协议将消息直接从浏览器推送到基于云的队列。
我已经通过 NPM 安装了 amqplib 和 written/pasted 以下模块:
var amqp = require('amqplib/callback_api');
var push = function(){
console.log('This is the CORE queue.pusher push function being triggered');
var connString = 'amqp://username:pwd@blabla.rmq.cloudamqp.com/username';
amqp.connect(connString, function(err, conn) {
if (err){
console.log("core queue.pusher push error %s", err);
}else {
conn.createChannel(function (err, ch) {
var q = 'FatController';
var msg = 'Hello World!';
ch.assertQueue(q, {durable: false});
// Note: on Node 6 Buffer.from(msg) should be used
ch.sendToQueue(q, new Buffer(msg));
console.log(" [x] Sent %s", msg);
});
setTimeout(function () {
conn.close();
process.exit(0)
}, 500);
}
});
};
module.exports = {push:push};
当我尝试 运行 时,出现以下错误:
bundle.js:32074 TypeError: QS.unescape is not a function
at openFrames (bundle.js:9551)
at connect (bundle.js:9629)
at Object.connect (bundle.js:7959)
at Object.push (bundle.js:7652)
at controller.pushQueueEntry (bundle.js:7805)
at fn (eval at compile (bundle.js:32907), <anonymous>:4:184)
at callback (bundle.js:44543)
at Scope.$eval (bundle.js:35710)
at Scope.$apply (bundle.js:35810)
at HTMLInputElement.<anonymous> (bundle.js:44548)
at defaultHandlerWrapper (bundle.js:21283)
at HTMLInputElement.eventHandler (bundle.js:21271)
我是不是找错人了?在 'proper' 节点环境中,amqplib 只能 运行 吗?
作为次要问题,确定特定 NPM 包是否会 运行 在浏览器环境中的最佳方法是什么?在我看来,有些 NPM 包会 运行 在浏览器中,有些则不会 - 对此有信心的最佳方式是什么?
Will amqplib only run in a 'proper' node environment?
是的,恐怕是。
As a secondary question, what is the best way to determine whether a particular NPM package will run in the browser environment? It seems to me that some NPM packages will run in the browser, and some won't - what is the best way to be confident about this?
一个包是否可以 运行 在浏览器中并不总是很清楚,所以你必须应用一些启发式方法:
- 包是否需要设置 "plain" TCP 连接(即不用于 HTTP(S) 或 WebSockets 等通常的基于 Web 的协议的连接)?如果是这样,它可能是一个服务器端包。
- 包是否需要读取任意文件?如果是这样,可能是服务器端。
- 软件包是否提供或依赖原生 Node.js 插件?如果有,那就是服务端包。
- 作为这些的扩展:它是否使用
fs
、net
、cluster
、http
、https
、tls
、dns
、os
、tty
还是dgram
?很可能是服务器端。
可以在客户端使用的软件包通常在其文档中如此说明,因此如果没有特别提及,很可能只是在服务器端使用。
我有一段时间没有使用 Browserify,所以我不得不检查一下,但如果您传递给它的代码依赖于服务器端模块,它似乎不会警告您。它将创建一个包,该包在某些时候会因错误而失败,就像您运行正在做的那样。
Webpack,另一个常用的打包器,有一个部署目标的概念。默认情况下,它将针对浏览器,当您尝试捆绑依赖于服务器端模块的项目(如我上面提到的那些)时,您将收到错误消息:
$ webpack -p bundle.js
Hash: 767ace79fc17abef93e8
Version: webpack 2.6.1
Time: 3983ms
Asset Size Chunks Chunk Names
bundle.js 308 kB 0 [emitted] [big] main
[0] <SNIP>
ERROR in ./~/amqplib/lib/connect.js
Module not found: Error: Can't resolve 'net' in '/private/tmp/node_modules/amqplib/lib'
@ ./~/amqplib/lib/connect.js 152:11-25
@ ./~/amqplib/channel_api.js
@ ./test.js
ERROR in ./~/amqplib/lib/connect.js
Module not found: Error: Can't resolve 'tls' in '/private/tmp/node_modules/amqplib/lib'
@ ./~/amqplib/lib/connect.js 155:11-25
@ ./~/amqplib/channel_api.js
@ ./test.js
如您所见,我的测试文件使用了amqplib
,它依赖于net
和tls
,它们在浏览器环境中都不可用。所以如果你不确定一个包是否可以在浏览器中使用,Webpack 为你提供了一个安全网。