Jou*_*man 1 amqp rabbitmq node.js angularjs node-amqp
我是AMQP / RabbitMQ新手,也是相对的Node.js新手。我可以在客户端使用amqplib NPM库吗?
我希望能够从Angular应用将消息直接推送到RabbitMQ。我已经使用Browserify模块化了很多客户端代码。我现在开始尝试RabbitMQ,并希望通过amqp协议将消息从浏览器直接推送到基于云的队列。
我已经通过NPM安装了amqplib并编写/粘贴了以下模块:
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};
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此命令时,出现以下错误:
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)
Run Code Online (Sandbox Code Playgroud)
我在这里树错树了吗?amqplib只能在“适当的”节点环境中运行吗?
作为第二个问题,确定特定NPM软件包是否将在浏览器环境中运行的最佳方法是什么?在我看来,某些NPM软件包将在浏览器中运行,而有些则不会-对此有信心的最佳方法是什么?
amqplib只能在“适当的”节点环境中运行吗?
是的,恐怕是这样。
作为第二个问题,确定特定NPM软件包是否将在浏览器环境中运行的最佳方法是什么?在我看来,某些NPM软件包将在浏览器中运行,而有些则不会-对此有信心的最佳方法是什么?
软件包是否可以在浏览器中运行并不总是很清楚,因此您必须应用一些启发式方法:
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
Run Code Online (Sandbox Code Playgroud)
如您所见,我的测试文件使用amqplib
,取决于net
和tls
,两者在浏览器环境中均不可用。因此,如果不确定是否可以在浏览器中使用软件包,Webpack将为您提供安全网。
归档时间: |
|
查看次数: |
1189 次 |
最近记录: |