CoteJS无法创建多个服务

时间:2019-04-08 15:46:04

标签: node.js typescript express cote

AM使用cote.js创建了多个服务,我在自己的文件中分别拥有40个服务。因此,问题是如果我启动其中两个,它们会正常工作,但是如果我启动第三个或所有它们,则它们将不起作用,包括之前的两个,控制台输出的屏幕截图:

这是应该的样子(启动两个服务时) expected

但这就是所得到的(启动两个以上时): outputted

request journey begins是应用程序第一个中间件中的第一行代码

sending...是在调用requester.send函数之前的输出

recieved: nullrequester.send函数回调中代码执行第一行的输出,null是回调中的error参数。

我的代码是站点文档页面上的常规/普通请求者/响应者,只是其中一项服务来自具有express listen功能的应用程序(ExpressJS应用程序)。

在此先感谢您的帮助。

我的请求者:

const requester = new Requester({
    name: 'app-main',
    key: process.env.APP_NAME
}, {
    redis: {
        host: process.env.REDIS_HOST,
        port: process.env.REDIS_PORT
    }
} as any);

app.set('requester', requester);

我基本上是在我的应用程序的整个路由中都使用此请求者

我的回复者:

import {config} from 'dotenv';
import {basename, resolve} from 'path';
import {Responder} from 'cote';

import * as moment from 'moment';

import {ServiceCallback, ServiceRequest, LoggingParam} from '../helpers/types';
import logger from '../logger';

config({
    path: resolve(__dirname, '..', '.env')
});

const responder = new Responder({
    name: basename(__filename).substring(0, basename(__filename).indexOf('.service')),
    key: process.env.APP_NAME
}, {
    redis: {
        host: process.env.REDIS_HOST,
        port: Number(process.env.REDIS_PORT)
    }
} as any);

responder.on(basename(__filename).substring(basename(__filename).indexOf('.') + 1, basename(__filename).indexOf('.service')), (request: ServiceRequest, callback: ServiceCallback) => {
    const logParam: LoggingParam = {
        level: 'info',
        load: {
            route: {
                userAgent: request.userAgent,
                ip: request.ip,
                body: request.requestBody,
                name: 'test'
            },
            content: {
                message: 'Test function accessed'
            }
        }
    };

    logger(logParam);

    callback(null, {
        status: 200,
        body: `
            <h1>API is up</h1>
            <p>Server time is ${moment().utcOffset(3).toDate()}</p>
        `
    });
});

我的路线声明示例:

router.post('/settings', (request: Request, response: Response) => requestHandler(request, response, 'settings'));

请求处理函数:

export function requestHandler(request: express.Request, response: express.Response, handle: string): void {
    const requester: Requester = request.app.get('requester');

    const requestObject: ServiceRequest = {
        type: handle,
        channel: request.body.channel,
        requestBody: request.body.data,
        user: request.body.user,
        userAgent: request.get('User-Agent'),
        ip: request.ip
    };

    requester.send(requestObject, (error: any, result: ServiceResponse) => {
        if (process.env.NODE_ENV === 'development' || !request.body.keyCombo) {
            response.status(result.status).send(result.body);

            return;
        }

        let dataToEncrypt = result.body;

        if (result.body.constructor === {}.constructor) {
            dataToEncrypt = JSON.stringify(result.body);
        }

        const credentials = request.body.keyCombo.split(';');

        const key = enc.Utf8.parse(credentials[0]);
        const iv = enc.Utf8.parse(credentials[1]);

        const toEncrypt = enc.Utf8.parse(dataToEncrypt);

        const encrypted = AES.encrypt(toEncrypt, key, { iv: iv }).toString();

        response.status(result.status).send(encrypted);
    });
}

如果您需要我发布更多代码,请询问。

1 个答案:

答案 0 :(得分:1)

如果您没有解决此问题,我就遇到了同样的问题,您必须使用键

Keys cote具有另一种创建称为keys的分区的机制。 由于每个组件都会发现并尝试与每个组件进行通信 如果存在,则地平线上的其他组件(称为“网状网络”) 不同的服务请求并响应不同类型的消息, 您将遇到丢失的消息。换句话说,如果服务A 响应消息X和Y,服务B响应消息Z和 T,您将丢失一半的消息,因为消息Z和T将 也最终到达服务A,但它不知道如何处理它们。的 服务B同样如此:消息X和Y最终会到达它,但是 服务B不知道如何回应。