标签: nestjs

Nestjs 中多个 graphql 解析器实现的问题

我刚刚开始学习 NestJS 和 GraphQL。UserResolver我从 中定义的单个解析器类开始UserModule。此类提供读取用户列表或特定用户的方法。方法用 装饰@Query()user.graphql提供文件,GraphQL 在 中初始化AppModule,所有这些都如文档中所述。一切正常,我可以通过 Insomnia Tool 或 Playground 获取用户或特定用户的列表。我很开心!

现在我创建了第二个模块,RoleModule. 我创建了一个role.graphql文件和一个类,我基本上RoleResolver复制了为. 类型的 GraphQL 类型定义以及文件中的查询定义均被识别。不被识别的是我在类中的实现,它们没有被调用。UserRoleRolerole.graphqlQuery()RoleResolver

如果我将所有这些Role相关的@Query()定义放入UserResolver类中,这些Role相关的查询现在就会被调用。

这是预期的行为吗?我是否需要将所有 GraphQL 查询定义放入一个类中?是否可以将 NestJS-GraphQL 解析器实现分散到多个模块上?难道我做错了什么?请帮忙。

node.js typescript graphql nestjs

0
推荐指数
1
解决办法
2105
查看次数

在服务器上设置请求后,Cors 仍然阻止请求

即使我在服务器上启用了 CORS,Chrome CORS 仍然会阻止 API。我阅读了官方文档来启用CORS。我的后端是用 Nest.js 编写的,前端是用 Ionic/Angular 编写的。

除了官方文档之外,我还尝试了各种其他用户建议的解决方案,例如设置选项,但都不起作用。

使用 postman 时 API 调用工作得非常好。

这是服务器代码:

const app = await NestFactory.create(AppModule);
  const options = {
    origin: '*',
    headers: '*',
    methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
    preflightContinue: true,
    optionsSuccessStatus: 204,
    credentials: true,
  };
  app.enableCors(options);
  await app.listen(3000);
Run Code Online (Sandbox Code Playgroud)

这是 http 调用:

  this.http.post(`${this.config.serverAddress}/api/auth/login`,{'username': 'test', 'password': 'password'})
        .subscribe(d=>{
            console.log(d);
        })
Run Code Online (Sandbox Code Playgroud)

最后,这是 chrome 错误消息:

zone-evergreen.js:2952 Access to XMLHttpRequest at 'localhost:3000/api/auth/login' from origin 'http://localhost:8100' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, …
Run Code Online (Sandbox Code Playgroud)

javascript node.js typescript angular nestjs

0
推荐指数
1
解决办法
589
查看次数

在nestjs中重试rxjs

import { HttpService, Injectable } from '@nestjs/common';
import { retry } from 'rxjs/operators';

@Injectable()
export class XXXService {
  constructor(private http: HttpService) {}

  predictAll() {
    return this.http
      .post('https://xxxxx/xxxxx')
      .pipe(retry(5));
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我有以下代码来订阅上面的可观察值

import { Inject, Injectable } from '@nestjs/common';
import { XXXService } from '@api/services/XXX.service';

@Injectable()
export class YYYService {

  constructor(
    private readonly xxxService: XXXService
  ) {
    this.predictAll();
  }

  async predictAll() {
    await this.xxxService.predictAll().subscribe(
      ({ data }) => {
        console.log(data);
      },
      err => {
        console.log('error');
      }
    );
  }
}

Run Code Online (Sandbox Code Playgroud)

然后我尝试关闭我的互联网连接,经检查,“错误”仅在控制台中打印一次,这意味着我的可观察值根本没有重试。我这样做有什么问题吗?

rxjs nestjs

0
推荐指数
1
解决办法
5116
查看次数

无法连接到数据库 Heroku nestjs mongoose

我正在尝试将我的 nestjs 项目部署到 heroku。但是我在连接到 mongoDB 时一直有超时错误

2020-03-08T21:53:43.192716+00:00 app[web.1]: [31m[Nest] 54   - 
[39m03/08/2020, 9:53:43 PM   [38;5;3m[MongooseModule] [39m[31mUnable to connect to the database. 
Retrying (1)...[39m[38;5;3m +30084ms[39m
2020-03-08T21:53:53.398546+00:00 heroku[web.1]: State changed from starting to crashed
2020-03-08T21:53:53.308228+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
Run Code Online (Sandbox Code Playgroud)

奇怪的是它是 mongodb atlas 集群(在云上),当我尝试从我的机​​器上访问它时,一切都很好......

这是一个看起来像这样的网址: mongodb+srv://myDbUserName:myPassword@cluster0-opbo3.gcp.mongodb.net/test?retryWrites=true&w=majority

我试图MongooseModule 像这样直接传递uri, 这MongooseModule.forRoot(CONFIG.MONGODB_URI)在我的机器上再次起作用......但不是heroku......

我还尝试在 heroku 中添加 MONGODB_URI 作为 env 变量并使用它:process.env.MONGODB_URI但没有运气。

我错过了什么?

如果您有任何想法!谢谢你们 !

timeout mongoose mongodb node.js nestjs

0
推荐指数
1
解决办法
2410
查看次数

@nestjs/jwt - 无法读取未定义的属性“挑战”

jwt在我的nestjs应用程序中使用令牌,但是当我运行我的项目并使用@UseGuards(AuthGuard())装饰器调用控制器时,应用程序调试返回以下错误:

Cannot read property 'challenge' of undefined
Run Code Online (Sandbox Code Playgroud)

jwt nestjs

0
推荐指数
2
解决办法
1393
查看次数

TypeOrm 查询构建器

我不知道如何使用 TypeOrm Query Builder 编写以下 MySql 语句

SELECT reg.id FROM farm.reg WHERE grpId = 'ABC';

此选择仅返回 ID,但我的查询构建器正在返回整个对象。

在这一刻,我的 NestJs 服务中有这个功能,但我需要使用“地图”,我不想......

 async getGrupIds(entity: string, grpId: string) {

        console.log(entity, grpId);
        const ids = await getRepository(reg)
        .createQueryBuilder(entity)
        .where('reg.grpId = :grpId', {grpId: grpId})
        .getMany();
        console.log(ids);
        return ids.map(o => o.id);

    }
Run Code Online (Sandbox Code Playgroud)

谢谢

typeorm nestjs

0
推荐指数
1
解决办法
8109
查看次数

NestJS:添加 cookie 解析器会导致错误

当我运行此代码时:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import cookieParser from 'cookie-parser';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(cookieParser());
  await app.listen(3000);
}
bootstrap();
Run Code Online (Sandbox Code Playgroud)

我得到:

(node:28) UnhandledPromiseRejectionWarning: TypeError: cookie_parser_1.default is not a function
    at bootstrap (/usr/src/app/dist/main.js:8:36)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
Run Code Online (Sandbox Code Playgroud)

如果我注释掉“app.use(cookieParser());” 问题消失了,但我需要 cookie 解析器。

cookies nestjs

0
推荐指数
1
解决办法
515
查看次数

Nestjs - 使用 fastify multipart 上传文件

我正在尝试使用 fastify 适配器使用 nestjs 上传多个文件。我可以按照此链接中的教程进行操作 -关于上传的文章

现在这使用 fastify-multipart 完成文件上传的工作,但我无法在上传之前使用请求验证,例如,这是我的规则文件模型(后来我想保存到 postgre)

    import {IsUUID, Length, IsEnum, IsString, Matches, IsOptional} from "class-validator";
    import { FileExtEnum } from "./enums/file-ext.enum";
    import { Updatable } from "./updatable.model";
    import {Expose, Type} from "class-transformer";
    
    export class RuleFile {
      @Expose()
      @IsUUID("4", { always: true })
      id: string;
    
      @Expose()
      @Length(2, 50, {
        always: true,
        each: true,
        context: {
          errorCode: "REQ-000",
          message: `Filename shouldbe within 2 and can reach a max of 50 characters`,
        },
      })
      fileNames: string[];
    
      @Expose()
      @IsEnum(FileExtEnum, …
Run Code Online (Sandbox Code Playgroud)

file-upload nestjs fastify

0
推荐指数
2
解决办法
2935
查看次数

nestjs 在简单的提供程序类中使用 ConfigService

是否可以访问由简单提供者类中的配置工厂制作的嵌套配置?

喜欢:

/*Can't use ConfigService because there is no way of injecting it seemingly*/
export const databaseProviders = [
  {
    provide: 'SEQUELIZE',
    useFactory: async () => {
      const sequelize = new Sequelize({
        host: ConfigService.get<string>('pg.host'),
        port: ConfigService.get<number>('pg.port'),
        dialect: 'postgres',
        username: ConfigService.get<string>('pg.username'),
        password: ConfigService.get<string>('pg.password'),
        database: ConfigService.get<string>('pg.database')
      });
      sequelize.addModels([
         models...
      ]);
      await sequelize.sync(
        process.env.NODE_ENV === 'developent' && {
          force: true
        }
      );
      return sequelize;
    }
  }
];
Run Code Online (Sandbox Code Playgroud)

config/configuration.ts

export default () => ({
  pg: {
    host: 'localhost',
    port: 5432,
    username: process.env.NODE_ENV logic...
    password: …
Run Code Online (Sandbox Code Playgroud)

config typescript nestjs

0
推荐指数
1
解决办法
868
查看次数

无法使用 nestjs/mongoose 连接 mongoDB

我有一个 nest.js 节点服务器,我试图在 app.module 中连接 mongoDB 数据库,当连接字符串不包含数据库名称时 - 连接到默认数据库“测试”成功,但是当我指定数据库名称 - 总是收到“身份验证失败”错误。

app.module.ts:

这有效:

  imports: [
    MongooseModule.forRoot('mongodb://admin:admin@localhost:30000'),
  ]
Run Code Online (Sandbox Code Playgroud)

但是指定数据库名称失败并出现身份验证错误:

  imports: [
    MongooseModule.forRoot('mongodb://admin:admin@localhost:30000/test'),
  ]
Run Code Online (Sandbox Code Playgroud)

或者:

  imports: [
    MongooseModule.forRoot('mongodb://admin:admin@localhost:30000/data'),
  ]
Run Code Online (Sandbox Code Playgroud)

直接使用 MongoClient(不带 nestjs)连接成功:

const client = new MongoClient('mongodb://admin:admin@localhost:30000');
await client.connect();
db = client.db('data');
Run Code Online (Sandbox Code Playgroud)

知道我的问题是什么,我应该怎么做才能解决这个问题?

谢谢。

mongoose mongodb node.js nestjs

0
推荐指数
3
解决办法
2107
查看次数