标签: nestjs

是否可以为 DTO 设置默认值?

当查询为空时,有没有办法使用默认值?

如果我有以下 DTO 查询:

export class MyQuery {
  readonly myQueryItem: string;
}
Run Code Online (Sandbox Code Playgroud)

我的请求不包含查询,那么myQuery.myQueryItem 将是未定义的。我如何使它具有默认值?

javascript node.js typescript nestjs

14
推荐指数
1
解决办法
1万
查看次数

我可以将实体字段名称映射到 typeorm 中的别名列名称吗?

我正在使用 TypeORM 从 Rails 迁移到 NestJs。由于历史原因,Rails 中的表名和列名都是蛇形的——我不想把这个麻烦复制到我们的 NestJs/React 端

我可以在 NestJS (typeorm) 中创建名为 firstName 的实体字段,但映射到我的数据库中名为 first_name 的列吗?

我的桌子

+-------------+--------------+----------------------------+
|                      system_users                       |
+-------------+--------------+----------------------------+
| id          | int(11)      | PRIMARY KEY AUTO_INCREMENT |
| first_name  | varchar(100) |                            |
| last_name   | varcahr(100) |                            |
+-------------+--------------+----------------------------+
Run Code Online (Sandbox Code Playgroud)

我的用户实体类

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity({ name: 'system_users' })
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 255 })
  first_name: string;  <-- I WANT THIS TO BE firstName (camelCased)

  @Column({ …
Run Code Online (Sandbox Code Playgroud)

typeorm nestjs

14
推荐指数
1
解决办法
9711
查看次数

端到端测试中的 NestJS 模拟 JWT 身份验证

我想在 NestJS e2e(集成)测试中模拟 JWT 身份验证。我在我的业务逻辑中使用注入的令牌数据,并且我不想在我的测试代码中插入凭据。

我按照Nest authentication docs实现了 JWT 身份验证。我使用@User与示例中的装饰器类似的装饰器,并在我的业务逻辑中使用有关用户对象的信息。

@Post()
async myPostEndpoint(@Body() body: PostBody, @User() user: MyUser){
    // do stuff using user properties
}
Run Code Online (Sandbox Code Playgroud)

当按照Nest 测试文档中的指示使用 supertest 测试我的应用程序时,我不想发出真正的身份验证请求,因为我需要在我的版本控制系统中保留凭据。

我希望能够覆盖提供者以返回测试用户。却想不通。

我尝试覆盖AuthService'svalidateClientlogin使用Nest 测试文档overrideProvider + useClass/useFactory/useValue中的指示返回默认用户。我还尝试覆盖and 中的方法,但请求仍然返回 401 - Unauthorized。JwtStrategyLocalStrategy

authentication unit-testing mocking typescript nestjs

14
推荐指数
2
解决办法
5321
查看次数

NestJS 中的可注入是什么?

我正在学习 NestJS,这是我的简单服务:

import { Injectable } from '@nestjs/common';

const userMock = [{ account: 'dung', password: '12345678' }];

@Injectable()
export class UserService {
  getUser() {
    return userMock
  }
}

Run Code Online (Sandbox Code Playgroud)

我不太了解@InjectableNestJS。一些教程告诉@Injectable我们@Controller知道这是一个安装并且可以将其用作依赖项注入。但当我删除它时,它仍然有效。

请举例说明有@Injectable和没有的区别@Injectable

node.js typescript nestjs

14
推荐指数
2
解决办法
2万
查看次数

捆绑 NestJS + TypeORM 应用程序(使用 webpack)

我最近必须考虑一个新软件的部署方法,该软件是用以下代码编写的:

  • NestJS 6 / Express
  • 类型ORM 0.2
  • 使用 TypeScript

该软件将部署在160多台服务器上,分布在欧洲各地,其中一些服务器的互联网连接非常糟糕。

我做了一些研究,很多人明确建议 反对捆绑。主要论点是,原生扩展将因像webpack或 这样的捆绑器而失败rollup(剧透:这是真的,但有一个解决方案)。在我看来,这很大程度上是因为人们不关心这一点:作者对这个用例node-pre-gyp使用了几乎相同的词语。因此,通常情况下,我被告知要使用yarn install同步node_modules/文件夹

该项目是新的,但node_modules/文件夹已经超过 480 MB。使用 XZ 进行最大压缩后,我得到了 20 MB 的存档。这对我来说仍然太大了,而且似乎是对资源的巨大浪费。

我还看了以下问答:

TypeORM 还有一些单独的问答,但所有这些似乎都需要安装ts-nodeor typescript …

bundling-and-minification typeorm nestjs

14
推荐指数
1
解决办法
8704
查看次数

将 prisma 生成的类型与 swagger Nestjs 一起使用

我将 Nestjs 与 prisma 和 swagger 一起使用。当我使用

import {PrismaGeneratedType} from '@prisma/client';

...

@ApiOkResponse({type: PrismaGeneratedType})
Run Code Online (Sandbox Code Playgroud)

在控制器中如果给出错误:

'PrismaGeneratedType' only refers to a type, but is being used as a value here
Run Code Online (Sandbox Code Playgroud)

因为 prisma 生成types而不是类定义。如何使用 Prisma 生成的客户端(类型)与 swagger 一起使用?

swagger nestjs prisma

14
推荐指数
1
解决办法
4758
查看次数

类型错误:Reflect.getMetadata 不是函数

这是我启动 Nest 服务器时遇到的问题:

back-end/node_modules/@nestjs/common/decorators/core/optional.decorator.js:22
                const args = Reflect.getMetadata(constants_1.OPTIONAL_DEPS_METADATA, target) || [];
                                     ^

TypeError: Reflect.getMetadata is not a function
        at /Users/lucabento-versace/OneDrive-Ynov/Projets/3eme_annee/WEB/TrueEat/back-end/node_modules/@nestjs/common/decorators/core/optional.decorator.js:22:34
        at /Users/lucabento-versace/OneDrive-Ynov/Projets/3eme_annee/WEB/TrueEat/back-end/node_modules/@nestjs/common/node_modules/tslib/tslib.js:104:41
        at Object.__decorate (/Users/lucabento-versace/OneDrive-Ynov/Projets/3eme_annee/WEB/TrueEat/back-
end/node_modules/@nestjs/common/node_modules/tslib/tslib.js:99:99)
        at Object.<anonymous> (/Users/lucabento-versace/OneDrive-Ynov/Projets/3eme_annee/WEB/TrueEat/back-end/node_modules/@nestjs/common/services/console-logger.service.js:204:43)
        at Module._compile (internal/modules/cjs/loader.js:1085:14)
        at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
        at Module.load (internal/modules/cjs/loader.js:950:32)
        at Function.Module._load (internal/modules/cjs/loader.js:790:12)
        at Module.require (internal/modules/cjs/loader.js:974:19)
        at require (internal/modules/cjs/helpers.js:93:18)
Run Code Online (Sandbox Code Playgroud)

我对此进行了徒劳的测试:npm i reflect-metadata 我已经查看了有关相同错误的问题,但我找不到任何解决方案

typescript nestjs

14
推荐指数
2
解决办法
2万
查看次数

无法在 Nestjs 中导入 ESM 模块

我在基于 Nest.js 的项目中导入 ESM 模块时遇到问题。据我了解,这个问题不仅与 Nest.js 有关,也与 Typescript 相关。

我尝试了 Node.js 和 typescript 版本的各种操作和组合,添加"type":"module"到文件package.json的设置并进行更改,因此它具有以下视图,与默认tsconfig.json相去甚远:

{
  "compilerOptions": {
    "lib": ["ES2020"],
    "esModuleInterop": true,
    "module": "NodeNext",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "moduleResolution": "Node",
    "target": "esnext",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true,
    "skipLibCheck": true,
    "strictNullChecks": false,
    "noImplicitAny": false,
    "strictBindCallApply": false,
    "forceConsistentCasingInFileNames": false,
    "noFallthroughCasesInSwitch": false,
  }
}
Run Code Online (Sandbox Code Playgroud)

我的完整环境是:

  • Node.js (19.2.1 LTS) 通过 nvm 管理
  • Typescript(4.9.4,但我也尝试过4.3.5)
  • @nestjs/common:9.2.1
  • @nestjs/核心:9.2.1
  • ts-加载程序:“9.4.2”,
  • ts 节点:“10.9.1”, …

javascript node.js typescript es6-modules nestjs

14
推荐指数
1
解决办法
1万
查看次数

NestJS:使用 JWT 向 AuthGuard 添加验证选项

我正在尝试AuthGuard按照文档使用装饰器和通行证 JWT 策略。

文档中的所有内容都很好用。但是我现在想保护具有包含在 JWT 中的范围的路由。所以这是我的应用程序生成的基本 jwt 负载:

{
  "user": {
    "id": "20189c4f-1183-4216-8b48-333ddb825de8",
    "username": "user.test@gmail.com"
  },
  "scope": [
    "manage_server"
  ],
  "iat": 1534766258,
  "exp": 1534771258,
  "iss": "15f2463d-8810-44f9-a908-801872ded159",
  "sub": "20189c4f-1183-4216-8b48-333ddb825de8",
  "jti": "078047bc-fc1f-4c35-8abe-72834f7bcc44"
}
Run Code Online (Sandbox Code Playgroud)

这是AuthGuard装饰器保护的基本受保护路由:

@Get('protected')
@UseGuards(AuthGuard('jwt'))
async protected(): Promise<string> {
    return 'Hello Protected World';
}
Run Code Online (Sandbox Code Playgroud)

我想添加选项并将该路由的访问权限限制为具有manager_serverJWT 范围的人员。所以在阅读了一些AuthGuard代码之后,我认为我可以写出类似的东西:

@Get('protected')
@UseGuards(AuthGuard('jwt', {
    scope: 'manage_server'
}))
async protected(): Promise<string> {
    return 'Hello Protected World';
}
Run Code Online (Sandbox Code Playgroud)

但是,我在文档中看不到可以使用此选项的地方。

我认为向 the 的validate函数添加一个选项参数JWTStrategy可以解决问题,但事实并非如此。这是我的validate函数(包含在 …

javascript node.js nestjs

13
推荐指数
2
解决办法
1万
查看次数

在NestJS HTTP服务器中使用子进程时,CPU绑定的进程会阻止工作池

节点版本: v10.13.0

我正在尝试对NodeJS请求并发性进行非常简单的测试,包括繁重的CPU计算.我理解NodeJS不是CPU绑定进程的最佳工具,并且不应系统地生成子进程,但此代码是为了测试子进程的工作原理.这也是使用NestJS用TypeScript编写的.

SRC/app.controller.ts

import { Get, Param, Controller } from '@nestjs/common';
import fork = require('child_process');

@Controller()
export class AppController {
  @Get()
  async root(): Promise<string> {
    let promise = new Promise<string>(
        (resolve, reject) => {
          // spawn new child process
          const process = fork.fork('./src/cpu-intensive.ts');
          process.on('message', (message) => {
            // when process finished, resolve
            resolve( message.result);
          });
          process.send({});    
        }
    );    
    return await promise;
  }
}
Run Code Online (Sandbox Code Playgroud)

SRC/CPU-intensive.ts

process.on('message', async (message) => {
  // simulates a 10s-long process
  let now = …
Run Code Online (Sandbox Code Playgroud)

child-process httpserver node.js nestjs

13
推荐指数
1
解决办法
448
查看次数