我正在使用 mongodb 作为我的数据库,使用 Nestjs 框架创建一个应用程序。在我的 CRUD findOne 方法中,我想验证发送的 ID 是否为 Mongo ObjectID,如果不是,则返回 400(默认情况下,如果让它流过,则返回 500)。我可以手动检查这一点,但是有没有办法注释参数以使此验证自动进行?
@Get(':id')
findOne(@Param('id') id: string) {
return this.usersService.findOne(id);
}
Run Code Online (Sandbox Code Playgroud) 该数据库包含以下数据:
[
{id: 1, username: "test", amount: 2},
{id: 2, username: "example", amount: 0},
{id: 3, username: "hello", amount: 1},
{id: 4, username: "fsa", amount: 0},
{id: 5, username: "aas", amount: 10},
]
Run Code Online (Sandbox Code Playgroud)
现在我需要使用 typeorm 查询来检索数据,但我需要根据 amount 字段对其进行排序,并且限制只有 3 个用户,所以我应该得到这个:
[
{id: 5, username: "aas", amount: 10},
{id: 1, username: "test", amount: 2},
{id: 3, username: "hello", amount: 1},
]
Run Code Online (Sandbox Code Playgroud)
如何进行该查询?
我不确定如何编写guardin的单元测试用例文件nestjs。我有以下Role.guard.ts文件。我必须创建Role.guard.spec.ts文件。有人可以帮忙吗?
import { Injectable, CanActivate, ExecutionContext, Logger } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { ROLES_KEY } from './roles.decorator';
import { Role } from './role.enum';
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(context: ExecutionContext): boolean {
const requiredRoles = this.reflector.getAllAndOverride<string[]>(ROLES_KEY, [
context.getHandler(),
context.getClass(),
]);
const { user } = context.switchToHttp().getRequest();
if (!user.role) {
Logger.error('User does not have a role set');
return false;
}
if (user.role …Run Code Online (Sandbox Code Playgroud) 我在 NestJs 中有一个微服务,这是 main.ts 文件:
async function bootstrap() {
const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
transport: Transport.REDIS,
options: {
url: 'redis://localhost:6379',
}
})
await app.listen();
console.log('Redis is running');
}
bootstrap();
Run Code Online (Sandbox Code Playgroud)
我想从服务调用 redis db:
import { createClient } from '@redis/client';
async createWorkspaceShareCode(data: GetWorkspaceShareCodeMessage) {
const client = createClient({
url: 'redis://localhost:6379'
});
await client.connect();
await client.set('key', 'value');
const value = await client.get('key');
return value;
}
Run Code Online (Sandbox Code Playgroud)
但这不是我想要的,问题如下:
我正在尝试使用 Passport 和 NestJS 来实现 JWT 身份验证,默认实现工作完美。就我而言,我想使用“电子邮件”而不是用户名,但不幸的是,位于 local.strategy.ts 内的验证函数仅接受“用户名”,并且在没有用户名参数的情况下甚至不会调用。请指教。
参考我使用过的实现,我一步一步按照指南进行操作
在 Laravel (php) 中有路线/article/:article,在控制器方法中我得到了模型:
function getArticle(ArticleModel $article) {...}
Run Code Online (Sandbox Code Playgroud)
如何在 NestJS 中做到这一点?我的控制器:
@Controller('/articles')
export class ArticlesController {
@Get('/:article/edit')
editArticle(@Param('article') articleId: number) {...}
}
Run Code Online (Sandbox Code Playgroud)
如何将 @Param('article') 转换为自定义装饰器 @ArticleParam() ,它将通过请求中的 id 返回我的 Article 实体?
我们使用 NestJS 作为基于微服务的架构的 Typescript 框架。我们的一些部署被称为“Kafka 工作线程”,这些 pod 运行的代码实际上并不公开任何 REST 端点,而只是监听 kafka 主题并处理传入事件。
问题是,配置为希望捕获任何抛出异常的全局异常过滤器没有捕获任何内容(我们最终点头UnhandledPromiseRejection)
异常过滤器的基本配置如下(遵循 NestJS 文档指南):
@Catch()
export class KafkaWorkerExceptionFilter implements ExceptionFilter {
private logger: AppLogger = new AppLogger(KafkaWorkerExceptionFilter.name);
catch(error: Error, host: ArgumentsHost): void {
this.logger.error('Uncaught exception', error);
}
}
Run Code Online (Sandbox Code Playgroud)
我们针对此类工作人员的控制器配置如下:
@Controller()
export class KafkaWorkerController {
private readonly logger = new AppLogger(KafkaWorkerController.name);
constructor(
) {
this.logger.log('Init');
}
@EventPattern(KafkaTopic.PiiRemoval)
async removePiiForTalent(data: IncomingKafkaMessage): Promise<void> {
await asyncDoSomething();
throw new Error('Business logic failed');
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我们期望全局异常过滤器捕获从控制器处理函数内部抛出的错误(以及从嵌套在其中进行同步/异步操作的实际函数抛出的实际错误)。这不会发生。
同样,按照 NestJS 文档实现此类过滤器,我尝试了多种方法以及“注册”该过滤器的方法组合,但没有成功:
{ …exception nestjs kafkajs nestjs-config nestjs-exception-filters
我有一个 Nestjs 模块,我想在其中使用APP_GUARD提供程序定义多个守卫。文档中的示例仅显示如何定义单个守卫。如何定义多个守卫?
import { APP_GUARD } from '@nestjs/core';
import { Module } from '@nestjs/common';
@Module({
providers: [
{
provide: APP_GUARD,
useClass: MyFirstGuard, // how can I add a second guard here?
},
],
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud) 我有一个 dto 文件:
export class UpdateUserDto {
@IsUUID()
public readonly uuid: string;
@IsObject()
@Type(() => UserModelDto)
public readonly dataToUpdate: UserModelDto;
}
Run Code Online (Sandbox Code Playgroud)
问题是,@Type() 装饰器似乎不起作用。我的 UserModelDto 看起来像这样:
export class UserModelDto {
@IsUUID()
@IsOptional()
public uuid?: string;
@IsEmail()
@IsOptional()
public email?: string;
@IsString()
@IsOptional()
public password?: string;
@IsJWT()
@IsOptional()
public refreshToken?: string;
}
Run Code Online (Sandbox Code Playgroud)
当我向控制器发送请求时,验证对字段不起作用,dataToUpdate但对它uuid有效。我尝试了很多方法但结果仍然相同。
我在 vscode 中有一个 Nestjs 项目,在调试模式下代码中的更改不会生效。然而,断点正常命中,但例如看不到更改的变量值 - 即它们保持为先前的值(更改之前的值)。
我的 launch.json 如下:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Debug Nest Framework",
"runtimeExecutable": "nodemon",
"runtimeArgs": ["--nolazy", "-r", "ts-node/register", "--config", "nodemon-debug.json"],
"program": "${workspaceFolder}/src/main.ts",
"autoAttachChildProcesses": true,
"restart": true
}
]
}
Run Code Online (Sandbox Code Playgroud)
并且nodemon-debug.json文件具有以下内容:
{
"watch": ["src"],
"ext": "ts, js",
"ignore": ["src/**/*.spec.ts"]
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,当我更改代码时,nodemon 确实注册了它并重新启动应用程序,从控制台可以看到:
C:\...\AppData\Roaming\npm\nodemon.cmd --nolazy -r ts-node/register --config nodemon-debug.json .\dist\main.js
[nodemon] 2.0.18
c:\...\AppData\Roaming\npm\node_modules\nodemon\lib\utils\log.js:34
[nodemon] to restart at any time, enter `rs`
c:\...\AppData\Roaming\npm\node_modules\nodemon\lib\utils\log.js:34
[nodemon] watching path(s): src\**\*
c:\...\AppData\Roaming\npm\node_modules\nodemon\lib\utils\log.js:34
[nodemon] watching extensions: …Run Code Online (Sandbox Code Playgroud) nestjs ×10
node.js ×4
javascript ×2
typeorm ×2
exception ×1
jestjs ×1
kafkajs ×1
mongodb ×1
nodemon ×1
passport.js ×1
redis ×1
typescript ×1
unit-testing ×1
validation ×1