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

标签 javascript node.js rabbitmq hapi.js

我正在Hapi框架中开发一个node.js服务器。我采用 RabbitMQ (amqp) 来对我的任务进行排队。不过,一旦发送请求,消息将被发送到实际功能作为消费者的 Rabbit 服务器,而不是立即回复请求。然后,消费者应该将结果返回给(请求,回复)函数并让该函数回复它。

现在我的解决方案是在我的工作文件(amqp 使用者所在的位置)中创建一个变量并将其导出。然后在索引文件(带有路由处理程序的主脚本)中,导入变量。一旦收到某个请求,它就会向 RabbitMQ 服务器发送一条消息,服务器将更改变量。然后,回到索引文件,脚本更新变量的值,然后回复它。显然,由于是异步的,程序会回复之前请求的结果。

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

下面是我的代码:

索引.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});
    });
});

最佳答案

您需要的是一种基于 RabbitMQ 的 RPC。它由 RabbitMQ 支持,如 tutorials here 中所示。 .

您可以使用amqplib自己实现它您已经在使用,或者您可以使用特定模块,例如 amqp-rpc为您做这件事。

关于javascript - Node.js 在脚本之间传输数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42404711/

相关文章:

Python RabbitMQ - 消费者只能看到每秒的消息

javascript - 解析器阻塞与渲染阻塞

javascript - 在 Angular 中显示来自 Rest Api 的数据的正确方法

angularjs - prerender.io aws 弹性 beanstalk 部署

node.js - Node JS - 系统信息,cpuTemperature 函数不返回温度

css - pugjs(jade) 模板引擎加载 css 文件

javascript - 消除在其他元素的滚动事件上更新元素的滚动顶部/滚动左时的延迟

javascript - Node.js 监听动态创建的对象上的事件

java - Spring云数据流: is it possible to run without any messaging middle-ware (kafka/rabbit) or with a db nstead of a queue?

rabbitmq - 为什么 spring-amqp 消费者性能很慢?