AM使用cote.js创建了多个服务,我在自己的文件中分别拥有40个服务。因此,问题是如果我启动其中两个,它们会正常工作,但是如果我启动第三个或所有它们,则它们将不起作用,包括之前的两个,控制台输出的屏幕截图:
request journey begins
是应用程序第一个中间件中的第一行代码
sending...
是在调用requester.send
函数之前的输出
recieved: null
是requester.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);
});
}
如果您需要我发布更多代码,请询问。
答案 0 :(得分:1)
如果您没有解决此问题,我就遇到了同样的问题,您必须使用键
Keys cote具有另一种创建称为keys的分区的机制。 由于每个组件都会发现并尝试与每个组件进行通信 如果存在,则地平线上的其他组件(称为“网状网络”) 不同的服务请求并响应不同类型的消息, 您将遇到丢失的消息。换句话说,如果服务A 响应消息X和Y,服务B响应消息Z和 T,您将丢失一半的消息,因为消息Z和T将 也最终到达服务A,但它不知道如何处理它们。的 服务B同样如此:消息X和Y最终会到达它,但是 服务B不知道如何回应。