AM создает несколько сервисов, используя cote.js, и у меня около 40 сервисов, каждый в своем файле. Итак, проблема в том, что если я запускаю два из них, они работают без проблем, но если я запускаю третий или все из них, они не работают, включая два, которые работали раньше, скриншот вывода консоли:
Вот так и должно быть (при запуске двух сервисов)
Но это то, что я получаю (когда запускается более двух):
request journey begins
— это самая первая строка кода в самом первом промежуточном программном обеспечении приложения.
sending...
- это вывод непосредственно перед вызовом функции requester.send
recieved: null
— это вывод в первой строке выполнения кода в обратном вызове функции requester.send
, null
— аргумент error
обратного вызова.
Мой код является обычным/нормальным запросчиком/ответчиком со страницы документации сайта, только одна из служб из приложения, которое также имеет функцию выражать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);
});
}
Если вам нужно, чтобы я опубликовал еще какой-либо код, пожалуйста, просто спросите.
Если вы не решили это, я столкнулся с той же проблемой, и вам нужно использовать ключи.
Keys cote has another mechanism to create partitions called keys. Since every component discovers and tries to communicate with every other component on the horizon (this is called a "mesh network"), if different services request and respond to different types of messages, you will experience lost messages. In other words, if service A responds to messages X and Y, and service B responds to messages Z and T, you will lose half of the messages, because messages Z and T will also end up at service A, but it won't know how to handle them. The same is true for service B: messages X and Y will end up at it, but service B won't know how to respond to them.
спасибо, я посмотрю, и да, я действительно не решил это