我刚刚开始学习 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 解析器实现分散到多个模块上?难道我做错了什么?请帮忙。
即使我在服务器上启用了 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) 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)
然后我尝试关闭我的互联网连接,经检查,“错误”仅在控制台中打印一次,这意味着我的可观察值根本没有重试。我这样做有什么问题吗?
我正在尝试将我的 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但没有运气。
我错过了什么?
如果您有任何想法!谢谢你们 !
我jwt在我的nestjs应用程序中使用令牌,但是当我运行我的项目并使用@UseGuards(AuthGuard())装饰器调用控制器时,应用程序调试返回以下错误:
Cannot read property 'challenge' of undefined
Run Code Online (Sandbox Code Playgroud) 我不知道如何使用 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)
谢谢
当我运行此代码时:
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 解析器。
我正在尝试使用 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) 是否可以访问由简单提供者类中的配置工厂制作的嵌套配置?
喜欢:
/*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) 我有一个 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)
知道我的问题是什么,我应该怎么做才能解决这个问题?
谢谢。