apollographql / graphql-subscriptions

:newspaper: A small module that implements GraphQL subscriptions for Node.js
MIT License
1.58k stars 133 forks source link

Nest JS: Object is possibly 'undefined' in GraphQL #265

Open aldoprogrammer opened 12 months ago

aldoprogrammer commented 12 months ago

I tried to make the subscription update course in the nest js, but it turns out error Object is possibly 'undefined' in this line of code const course = await this.courseService.findOne({ id: variables.courseId });below is my course.resolver.ts

@Subscription('courseUpdated', {
    resolve: (value) => value,
    filter: async (payload, variables) => {
      const course = await this.courseService.findOne({ id: variables.courseId });
      if (!course) {
        throw new NotFoundException('Course not found');
      }
      if (course.creatorId !== variables.userId) {
        throw new ForbiddenException('Course not owned by you');
      }
      return payload.courseId === variables.courseId;
    },
  })
  courseUpdated(
    @Args('courseId') courseId: string,
    @Args('userId') userId: string,
  ) {
    return pubSub.asyncIterator(`course:${courseId}`);
  }

Here is the piece of code in my course.graphql

type Course {
  id: String
  title: String
  objective: [String!]
  description: String!
  language: String
  category: String!
  tone: String!
  modality: String!
  classSize: String!
  topics: [String!]
  duration: Int!
  durationLesson: Int!
  creatorId: String!

  outline: CourseOutline
  detailedOutline: CourseDetailedOutline

  createdAt: DateTime!
  updatedAt: DateTime!

  audience: Audience!
}

input UpdateCourse {
  title: String
  objective: [String!]
  description: String
  language: String
  category: String
  tone: String
  modality: String
  classSize: String
  topics: [String!]
  duration: Int
  durationLesson: Int
  audience: CreateAudienceInput

  outline: UpdateCourseOutline
  detailedOutline: UpdateCourseDetailedOutline
}

type Subscription {
     courseUpdated(courseId: String!): Course!
    }

I read a lot on stackoverflow but still couldn't solve it. Yes indeed some of the value is optional, but how to solve it. I also tried the chaining option like thisconst course = await this.courseService.findOne({ id: variables.courseId })?.id; but still does not work

System:

 "graphql-subscriptions": "2.0.0",
"@nestjs/cli": "^10.1.16",
"@nestjs/graphql": "^12.0.8"