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



我正在HAPI框架中开发一个node.js服务器。我采用RabbitMQ(AMQP)排队我的任务。但是,一旦发送请求,而不是立即回复请求,而是将一条消息发送到兔子服务器,实际功能座位为消费者。然后,消费者应将结果返回(请求,回复)功能,然后让该功能回复。

现在,我的解决方案是在我的工作文件(AMQP消费者位置)中创建一个变量并导出它。然后在索引文件(我带有路由处理程序的主要脚本)中,我导入变量。收到某些请求后,它将向RabbitMQ服务器发送消息,并且服务器将更改变量。然后,返回索引文件,脚本更新了变量的值,然后回复。显然,由于异步,该程序回复了先前请求的结果。

我做了一些研究,发现我们不应该在脚本之间共享一些变量。有没有人有办法解决吗?我的目标是,我可以将我的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。它得到了兔子的支持,如下所示。

您可以使用已经使用的AMQPLIB自己实现它,也可以使用像AMQP-RPC这样的特定模块为您做。

最新更新