aizatto.com
  • aizatto.com
  • Table of Contents
  • Portfolio, Projects, Tools, Toys
  • Interview Guide
    • Choosing A Company
    • Job Boards
    • Practice
    • Technical Interview Cheatsheet
    • Interview Process
      • Questions to Ask
      • Coding
      • Soft Skills
      • Rejection
      • Negotiation / Deciding
      • Accepting, Joining
    • FAQ
  • Engineering Code
    • Communication
    • Different Types of Coding
    • Commit Messages
    • Reviewing Code
      • Requesting Changes
    • Writing Code
      • Consistency
      • Writing for a code base of 1,000,000+ Lines
      • Write Code Knowing It Will Be Refactored
      • Naming
        • Versioning
        • Create Searchable Names
      • Commenting
        • Don't commit commented code
      • Make It Easy To Reproduce
      • Scripts
      • 80 character limit
      • Exit Early
      • Be careful of enum in switch statements
      • Be careful about chaining conditions
      • Be careful of chaining ternary operators
      • Write Code Knowing You Will be Blamed
      • Hacks
      • Bad Practices
      • Logs
      • Time
      • Other rules
    • Engineering Code
    • Engineering Data
    • Pipelines
    • Configuration Files
    • Site Reliability Engineering (SRE)
    • Best Engineers
  • Engineering Management
    • Hiring
    • New Reports
    • 1:1s
      • Calibration
      • Expectations
      • Mentorship / Learning / Growing
      • Task Management
      • Teams
    • Interviewing Candidates
    • Messenger Groups
    • Resources
  • Why GitBook?
  • Getting into Tech
    • Terminology
  • Personal Goals
  • Daily Drivers
  • Contacting Me
  • Notes
    • JavaScript
      • Array
      • Async & Await / Promises
      • Booleans
      • Collections
      • Cons/Dislikes
      • fetch
      • Map
      • Modules
      • Object
      • Regex
      • Set
      • Style Guides
      • Versions
    • Node.js
      • Best Practices
      • DraftJS
      • eslint
      • GraphQL
      • Relay
      • Hapi
      • Knex
      • Koa
      • TypeScript
      • Webservers
    • Technical Due Diligence
    • Archive
      • Amazon Echo Dot (3rd Gen) with clock
      • Apple
        • AirPods Pro
        • Apple Notes
        • Apple Watch Series 4
        • iPad Pro 11" 2018
        • MacBook Pro 15" 2017
        • macOS
      • Audible
      • Balance
        • Growth vs Contentment
        • Leading vs Following
        • Mindful vs Mindless
        • New vs Old
      • Bags
      • Bandwidth Requirements
      • B2B/B2C
      • Blockchain
      • Board Games
        • Bang
      • Broadway
      • Cheap, Good, Fast
      • CLI
        • git
        • ufw
        • xargs
      • Cloud Providers
        • GCP
      • Communication
        • Asking Questions / Making Requests
        • Making Edits
        • Synchronous vs Asynchronous
        • Change Management
        • Problem Definition
      • Company
        • All Hands
        • The Problematic CTO
        • Organizational Structure
      • Content Creation
      • COVID 19/Corona Virus
      • Coworking Spaces
      • Daily Routine
      • Dating
      • Displays / Monitors
      • DNS
      • Domain Registrars
      • Driving
      • eCommerce
      • Empire Building
      • Facebook for Developers
      • Fever
      • Fiverr
      • Flights
      • Gaming Tablet
      • GitHub
      • GTD
      • Go Lang
      • Headsets
      • Hiking
        • Chamang Waterfalls
        • Kanching Waterfalls
        • Kota Damansara Community Forest Reserve
        • Sungai Chilling
      • Home Device Calling
      • iCalendar
      • Keyboards
        • Ergodox Ez
      • Malaysia Insurance
      • Mental Health Malaysia
      • Multiroom Wireless Speaker System
      • Musicals
      • Mouse
      • Movies
      • Password Managers
      • Phabricator
      • Physical Health
        • Cardio
      • Podcasts
      • Programming Bootcamps
      • Property
      • Productivity
        • Note Taking
      • Redang
      • Relationships
      • Referral Codes
      • Remote Calls
      • Remote Work
        • Comparison
      • Road Trips
      • Ruby / Ruby on Rails
      • Scraping
      • Slack
      • Stripe
      • Singapore
      • UX
      • Venture Builder
      • Video Games
      • Virtual Personal Assistant
      • VPN
      • WebDAV / CalDAV
      • WebSocket
      • Withings
      • Xiaomi Roborock Mijia
      • Old Hardware
        • Netgear R7000P
      • Web Development
        • React
        • SSO Providers
      • Software Engineering
        • Software Architectures
          • Monolithic
          • Non-Monolithic
            • Microservice
            • FaaS (Functions as a Service) or Serverless
        • Repository Management
  • More on Notion
Powered by GitBook
On this page
  • Directory Structure
  • Schema
  • Resolvers
  • Bugs
  • Could not convert from GraphQL type String

Was this helpful?

  1. Notes
  2. Node.js

GraphQL

This page refers to the GraphQL JavaScript package

PreviouseslintNextRelay

Last updated 6 years ago

Was this helpful?

Directory Structure

src/graphql/Schema.ts
src/graphql/Mutation.ts
src/graphql/User.ts (GraphQLObjectType)
src/graphql/mutations/UserMutation.ts

Schema

Put edges in a "Viewer" GraphQLObjectType so that you can use it as the "root" object.

type Query {
  entries(order: String, sort: String, after: String, first: Int, before: String, last: Int): EntryConnection
  tags(after: String, first: Int, before: String, last: Int): TagConnection
  viewer: Viewer
}

type Viewer implements EntryConnectionInterface {
  entries(order: String, sort: String, after: String, first: Int, before: String, last: Int): EntryConnection
  tags(after: String, first: Int, before: String, last: Int): TagConnection
}

Resolvers

Naming:

  • Postfix function names with Resolver

  • Pass in all the args: root, args, context, info

Entry.ts
// For the connections
`query {
  entries(...) {
     edges...
  }
}`
export async function EntriesResolver(root, args, context, info);

`query {
  entry(...) { }
}`
export async function EntryResolver(root, args, context, info);

// My suggestion is put this function in the `Tag.ts` file.
// The goal is put all Resolvers that query the same database in the same file
`query {
  entry(...) {
    tags(...) { 
      edges...
    }
  }
}`
export async function EntryTagsResolver(root, args, context, info) {
  const row = await knex
    .from("tags")
    .where({
      tag.entryID: root.id,
    })
    .select();
    
  ...
}
export async function EntryResolver(
  root,
  args,
  context: Context,
  info
): Promise<any> {
  const userUUID = getUserUUIDFromContext(context);

  const where = {
    uuid: args.uuid,
    createdBy: userUUID
  };

  const row = await knex
    .from("users")
    .where(where)
    .limit(1)
    .select();
  return row.shift();
}

Bugs

Could not convert from GraphQL type String

When running relay-compiler I would get this error:

Could not convert from GraphQL type String

Environment: Lerna with multiple graphql packages installed

Solution specify resolutions in local package.json:

package.json
"resolutions": {
  "graphql": $your_version
}

Worse case, nuke your node_modules:

rm -rf \
  packages/your-package/node_modules/ \
  node_modules/ \
  yarn.lock
http://github.com/graphql/graphql
https://www.aizatto.com/notes/graphql