I'm submitting a...Bug report
[ ] Regression
[*] Bug report
[ ] Feature request
[ ] Documentation issue or request
[ ] Support request => Please do not submit support request here, instead post your question on Stack Overflow.
Current behavior
Hello,
I'm using the graphql example( in the example directory of nest) with the Cat CRUD and i try to use a union type and interface but i didn't find a way to do it.
When i try to request my data with a fragment, i have the following error :
"Abstract type MutationResult must resolve to an Object type at runtime for field Mutation.createCat with value "[object Object]", received "undefined". Either the MutationResult type should provide a "resolveType" function or each possible types should provide an "isTypeOf" function."
There is nothing in the doc explaining how to use union / interface, and there is nothing in the graphql example.
In the apollo documentation, the type resolver ( here "Cat" Resolver") should implement a __resolveType function. I tried to set this function in the @resolver('Cat') class CatsResolvers
but it's not working.
I tried to add it on the cat resolvers class
Expected behavior
The request should return either a Cat item or GraphQLErrorItem from my schema definition.
Minimal reproduction of the problem with instructions
export interface GraphQLError {
readonly message: string;
readonly errorCode: number;
readonly type: string;
}
type GraphQLError {
message: String
errorCode: Int
type: String
}
union MutationResult = Cat | GraphQLError
- change the createCat Mutation in the schema
- createCat(name: String, age: Int): MutationResult
- add the function in cats.resolvers.ts in the CatsResolvers class
__resolveType(obj, context, info): string{
return obj.errorCode ? 'GraphQLError' : 'Cat';
}
What is the motivation / use case for changing the behavior?
Environment
Nest version: 4.5.10 (core)
For Tooling issues:
- Node version: 9.4
- Platform: Mac
Others:
Hi, I am new to NestJS, so I hope this issue is not my mistake. I think NestJS's GraphQL module does not support resolvers that returns observables. This is kind of unexpected as the REST counterpart (i.e. controllers) supports observables.
With heyPromise
, I am able to get 'from promise'. However, heyObservable
returns this instead:
{
"data": {
"heyObservable": "[object Object]"
}
}
The expected data for heyObservable
should be 'from rxjs'. For now, we will need to workaround by turning the observable into a promise (i.e. heyObservable_workaround_is_ok
)
Snippet of schema & resolvers used:
type Query {
heyPromise: String
heyObservable: String
}
@Query()
async heyPromise () {
return new Promise(resolve => resolve('from promise'))
}
@Query()
heyObservable () {
return of('from rxjs')
}
@Query()
heyObservable_workaround_is_ok () {
return of('from rxjs').toPromise()
}
I'm submitting a...
Current behavior
When I try to inject GraphQLFactory
into either a factory function or a class passed to GraphQLModule.forRootAsync()
, the app fails to bootstrap, with no error displayed in the console.
Expected behavior
I think I should be able to inject GraphQLFactory
and use it in a factory or class passed to .forRootAsync()
.
Minimal reproduction of the problem with instructions
git clone [email protected]:nestjs/nest.git
cd nest/sample/12-graphql-apollo
npm install
- edit app.module.ts to look like:
imports: [
CatsModule,
GraphQLModule.forRootAsync({
useFactory(graphQLFactory: GraphQLFactory) {
return {
typePaths: ['./**/*.graphql'],
installSubscriptionHandlers: true,
};
},
inject: [GraphQLFactory]
}),
],
npm run start
What is the motivation / use case for changing the behavior?
I want to use the GraphQLFactory.mergeTypesByPaths()
method to do some pre-processing of my schema when bootstrapping my app. Up until today I was using the old v3.0.0 way of configuring graphql, where I could inject GraphQLFactory
into my AppModule.
Now I am upgrading to v5.1.0 and it seems that when I try to inject GraphQLFactory
into either a factory function or a class passed to GraphQLModule.forRootAsync()
, the app fails to bootstrap with no error.
Environment
Nest version: 5.3.0
"@nestjs/common": "^5.3.0",
"@nestjs/core": "^5.3.0",
"@nestjs/graphql": "^5.1.0",
Trying to configure GraphQL subscriptions using existing express server.
But seems that there is some kind of conflict.
Error thrown in graphiql
console:
WebSocket connection to 'ws://localhost:3000/subscriptions' failed: Connection closed before receiving a handshake response

When using new server. There is no error.
Here the graphQL configuration I've used:
this.setSameServer()
- uses nest http server instance.
this.setDifferentServer()
- uses new http instance.
import {
MiddlewareConsumer,
Module,
HttpServer,
Inject,
NestModule,
OnModuleDestroy,
} from '@nestjs/common';
import { AppController } from 'app.controller';
import { AppService } from 'app.service';
import { graphqlExpress, graphiqlExpress } from 'apollo-server-express';
import { GraphQLModule, GraphQLFactory } from '@nestjs/graphql';
import { AuthorResolver } from 'author.resolver';
import { SubscriptionServer } from 'subscriptions-transport-ws';
import { execute, subscribe } from 'graphql';
import { createServer } from 'http';
import { HTTP_SERVER_REF } from '@nestjs/core';
@Module({
imports: [GraphQLModule, AuthorResolver],
controllers: [AppController],
providers: [
{
provide: 'SUBSCRIPTION_SERVER',
useFactory: () => {
const server = createServer();
return new Promise(resolve => server.listen(88, () => resolve(server)));
},
},
AppService,
],
})
export class AppModule implements NestModule, OnModuleDestroy {
private subscriptionServer: SubscriptionServer;
private subscriptionPort: number;
private wsServer: HttpServer;
constructor(
private readonly graphQLFactory: GraphQLFactory,
@Inject(HTTP_SERVER_REF) private readonly httpServerRef: HttpServer,
@Inject('SUBSCRIPTION_SERVER') private readonly ws: HttpServer,
) {
this.setSameServer();
//this.setDifferentServer();
}
private setSameServer() {
this.wsServer = this.httpServerRef.getHttpServer();
this.subscriptionPort = 3000;
}
private setDifferentServer() {
this.wsServer = this.ws;
this.subscriptionPort = 88;
}
public configure(consumer: MiddlewareConsumer) {
const typeDefs = this.graphQLFactory.mergeTypesByPaths('./**/*.graphql');
const schema = this.graphQLFactory.createSchema({ typeDefs });
const route = '/graphql';
const routeIDE = '/graphiql';
const routeSubs = '/subscriptions';
const middlewareIDE = graphiqlExpress({
endpointURL: route,
subscriptionsEndpoint:
'ws://localhost:' + this.subscriptionPort + routeSubs,
});
const middleware = graphqlExpress(req => ({
schema,
rootValue: req,
debug: false,
}));
consumer.apply(middleware).forRoutes(route);
consumer.apply(middlewareIDE).forRoutes(routeIDE);
this.subscriptionServer = new SubscriptionServer(
{
execute,
subscribe,
schema,
},
{
server: this.wsServer,
path: routeSubs,
},
);
}
public onModuleDestroy() {
this.subscriptionServer.close();
}
}
Used these issues for help:
nestjs/nest#500
#6
And full repo if you want to reproduce:
https://github.com/ph55/nest-graphql-subscriptions
@nestjs/graphql v5.0.0 not published?
When I run the nest sample 12-graphql-apollo
, it throws some errors
TSError: ⨯ Unable to compile TypeScript:
src/app.module.ts(8,19): error TS2339: Property 'forRoot' does not exist on type 'typeof GraphQLModule'.
Hi!
I just discovered this framework and I have to say it’s awesome. Kudos!
The GraphQL module is great, but I did not find any information regarding how to do batching and caching, which is pretty required to avoid a big waste of resources (see https://github.com/facebook/dataloader).
Given the fact that resolvers are automatically mapped, I guess there’s currently no way to do that, right? An integration with dataloader would be awesome, if not mandatory for any medium to large application.
And, happy new year, by the way. ☺️
Hello,
Is there any good way to validate data in mutations like string length etc?
typescript mutation { createSth(name:"something", website:"http://test.com/") { id name website } }
How can i validate name or website data?
PS: Kamil, great job with nestjs!
Regards
Recommend Projects
-
-
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
An Open Source Machine Learning Framework for Everyone
-
The Web framework for perfectionists with deadlines.
-
A PHP framework for web artisans
-
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
Some thing interesting about web. New door for the world.
-
A server is a program made to process requests and deliver data to clients.
-
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Some thing interesting about visualization, use data art
-
Some thing interesting about game, make everyone happy.
-
Recommend Org
-
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Open source projects and samples from Microsoft.
-
Google ❤️ Open Source for everyone.
-
Alibaba Open Source for everyone
-
Data-Driven Documents codes.
-
China tencent open source team.
-