Node.js在脚本之间传输数据

我正在Hapi框架中开发一个node.js服务器。 我采用了RabbitMQ(amqp)排列我的任务。 但是,一旦发送请求,不是立即回复请求,而是将消息发送到实际function所在的Rabbit服务器。 然后,用户应该返回结果给(请求,回复)函数并让函数回复它。

现在我的解决scheme是在我的工作文件(amqp使用者所在位置)创build一个variables并将其导出。 然后在索引文件(我的主要脚本与路由处理程序),我导入variables。 一旦收到一个请求,它会发送一个消息给RabbitMQ服务器,服务器将改变这个variables。 然后,回到索引文件,脚本更新variables的值,然后回复它。 显然,由于asynchronous,程序回复了以前请求的结果。

我做了一些研究,发现我们不应该在脚本之间共享一些variables。 有没有人有办法解决吗? 我的目标是,我可以把我的amqp消费者的脚本。 一旦我运行脚本,消费者将准备好接收任何相应的消息。 然后在我的索引文件中,一旦收到一个请求,就会发送一个消息给RabbitMQ服务器。 然后它应该抓住消费者的结果并回复它。

以下是我的代码:

index.ts

import * as Joi from "joi"; import * as amqp from "amqplib/callback_api"; import * as waitUntil from "wait-until"; import * as repository from "./repository"; import * as worker from "./worker"; // defien variables from internal modules let greeter = new repository.Greeter(); // register type import {Register} from "../../interfaces"; // define amqp related stuff let greeterReply = worker.greeterReply; // helloWorld config including handler, validate and auth export let register: Register = (server, options, next) => { server.route([ { method: "GET", path: "/greeter", config: { handler: (request, reply) => { let q: string = "greeter"; let requestQuery = request.query; let requestString = JSON.stringify(requestQuery); amqp.connect("amqp://192.168.0.31", (err, conn) => { conn.createChannel((err, ch) => { ch.assertQueue(q, {durable: false}); ch.sendToQueue(q, new Buffer(requestString)); }); }); waitUntil(500, 10, function condition() { greeterReply = worker.greeterReply; return (greeterReply !== null); }, function done(result) { reply(greeterReply); greeterReply = null; }); }, validate: { query: { name: Joi.string(), age: Joi.number() } }, } } ]); next(); }; register.attributes = { name: "greeter", version: "1.0" }; 

worker.ts

 // import external modules import * as amqp from "amqplib/callback_api"; // import internal modules import * as repository from "./repository"; import * as indexModule from "./index"; // defien variables from internal modules let greeter = new repository.Greeter(); export let greeterReply = null; amqp.connect("amqp://192.168.0.31", (err, conn) => { conn.createChannel((err, ch) => { let q: string = "greeter"; ch.assertQueue(q, {durable: false}); ch.consume(q, function (requestString) { let newRequest = JSON.parse(requestString.content.toString()); console.log("replied via amqp"); let result: string = "how are you"; result = greeter.helloWorld(newRequest.name, newRequest.age); console.log("the result is: ", result); greeterReply = result; }, {noAck: true}); }); }); 

你需要的是一种RPC over RabbitMQ。 它由RabbitMQ支持,如这里的教程所示。

您可以使用您已经使用的amqplib自己实现,也可以使用像amqp-rpc这样的特定模块来为您完成。