我正在尝试使用stream_socket_server()创建套接字服务器.
正常连接工作正常,但我想制作一个无需证书即可加密连接的服务器.我知道这可以用ADH密码完成,是的,我知道它在理论上不如证书安全......
我首先制作这个服务器的原因是模拟一个客户端连接到的不同服务器(通过这个协议,如果你想知道的话).
客户端被配置为首先请求证书,并回退到ADH - 我已经用真实的东西测试了它,它连接没有问题,所以问题在于套接字服务器.
到目前为止我尝试的所有内容都导致了"握手失败"错误.
我试过的一些配置:
<?php
$server = stream_socket_server(
"tls://127.0.0.1:6667",
$errorno,
$errstr,
STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,
stream_context_create(
array('ssl' => array('ciphers' => 'ADH'))
)
);
?>
<?php
$server = stream_socket_server(
"tls://127.0.0.1:6667",
$errorno,
$errstr,
STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,
stream_context_create(
array('ssl' => array('ciphers' => '-COMPLEMENTOFALL ADH'))
)
);
?>
Run Code Online (Sandbox Code Playgroud)
我也尝试调整客户端无条件地使用ADH(与上面的第二个例子一样),仅仅是为了测试,但是也失败了.
这种情况发生在我尝试的每个PHP版本中,最新版本是5.5.0.
有任何想法吗?
我有一个请求范围的可注入日志记录。
铁
import { Injectable, Scope } from '@nestjs/common';
@Injectable({ scope: Scope.REQUEST })
export class RequestLogger {
public log(message: string) {
console.log(message);
}
}
Run Code Online (Sandbox Code Playgroud)
(暂时忽略它尚未在请求中使用构造函数;这不是重点)
我还有一个带有一些单例注入的控制器。
我想以允许控制器仅启动一次的方式注入可注入的请求。在构造函数中注入它将使控制器在每个请求上重新创建,所以肯定不是这样的(是吗?)。
我尝试将其放在方法签名中,但这似乎没有任何作用。
例如
@Controller('register')
export class RegisterApiController {
public constructor(
private readonly registerService: RegisterService,
) {
console.log('Controller initiated');
}
@Post()
public async postIndex(
@Inject(RequestLogger) logger: RequestLogger,
): Promise<unknown> {
console.log('request made');
logger.log('Logger message to log');
return this.registerService.register();
}
}
Run Code Online (Sandbox Code Playgroud)
在应用程序引导之后(还包括“控制器启动”),每个请求都会以错误 500 终止,并在控制台中
Request made
[TypeError] Cannot read property 'log' of undefined
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以注入请求范围内的可注入项,而无需强制重新创建使用它的控制器?它是什么?
如果没有其他方法,是否至少有一种方法可以将初始控制器逻辑移动到其他地方,以便可以在那里完成第一个控制器初始化时需要执行的操作?
我正在制作一个需要使用 NestJS 的 CQRS 模块的应用程序,因为需求自然适合该模式。
应用程序逻辑的更新预计会很频繁,并且会在繁忙时间发生(这就是我的管理工作方式......),因此应用程序需要能够正常重启。然而,这意味着在关闭之前开始的事件可能不会完成,或者即使它们完成了,由于在重启之前发生了一些事件,一些传奇可能不会触发......我想确保不会发生。
我知道 NestJS 的 OnApplicationShutdown 和 OnApplicationBootstrap 挂钩,这正是为此目的,但我不确定我应该在那里做什么。如何捕获所有具有未完成处理程序和传奇的事件?然后重启后,如何让事件总线知道sagas监控的事件,而不执行已经执行的处理程序?
我想第二部分可以使用每个事件/处理程序组合的随机 ID 来解决,这将在日志中查找,如果存在,将跳过处理程序,如果没有,它将被执行并添加到日志...但即使有这样的解决方法,我也不知道如何做第一部分。会有很多事件,sagas(根据定义)执行命令,这意味着它们有副作用......即使所有命令都可以成为幂等的,事件的绝对数量和频繁重启意味着从第一个命令重新启动是一个不行。
我见过这个包,但我不确定它是否解决了这个特定的用例,或者它是否真的只是记录事件,仅此而已。