首页 > 解决方案 > 如何正确编写 GraphQL 解析器?

问题描述

因此,据我所知,GraphQL 站点有 S#*t 文档,其中包含嵌套查询,例如用户特殊性及其让我发疯(我现在真的很想把头发拉出来)。有人可以向我解释左轮手枪的工作原理以及为什么我正在做的事情不起作用吗?

问题: 我为我的 GraphQL API 创建了以下 index.js 文件:

var express = require('express');
var graphqlHTTP = require('express-graphql');
var { buildSchema } = require('graphql');

// Define Schemas
var schema = buildSchema(`
    type Query {
        user: User
    }
    type User {
        firstName: String
        lastName: String
        email: String
        socialMedia: SOCIALMEDIA
    }
    type SOCIALMEDIA {
        facebook: String
        instagram: String
        twitter: String
    }
`);

// Define resolver functions
var root = {
    User: {
        firstName: () => 'John',
        lastName: () => 'Doe',
        email: () => 'John.Doe@gmail.com'
    },
    SOCIALMEDIA: {
        facebook: () => 'John Doe Facebook',
        instagram: () => 'John Doe Instagram',
        twitter: () => 'John Doe Twitter'
    }

 };

var app = express();
app.use('/', graphqlHTTP({
    schema: schema,
    rootValue: root,
    graphiql: true,
}));
app.listen(8080, () => console.log('Now browse to localhost:8080'));

尽管我尽了最大努力,但当我提交以下查询时:

{
  user {
    firstName
  }
}

我得到以下答案:

{
  "data": {
    "user": null
  }
}

为什么会这样null?!?!我什至没有尝试过使用user(id: $ID): [User]迭代或任何类似于传递参数或函数的东西,它已经给了我坚持!

关于嵌套字段的工作方式,我缺少什么?

编辑: 哇......好吧,它工作了吗?

user: () => ({
        firstName: 'John',
        lastName: 'Doe',
        email: 'John.Doe@gmail.com',
        socialMedia: {
            facebook: 'John Doe Facebook',
            instagram: 'John Doe Instagram',
            twitter: 'John Doe Twitter'
        }
    }),

这种胡说八道的硬性规定是什么?

标签: node.jsgraphqlexpress-graphql

解决方案


尝试这个,

// Define Schemas
var schema = buildSchema(`
    type Query {
        getUser: User
        getSocialMedia: SOCIALMEDIA
    }
    type User {
        firstName: String
        lastName: String
        email: String
        socialMedia: SOCIALMEDIA
    }
    type SOCIALMEDIA {
        facebook: String
        instagram: String
        twitter: String
    }
`);

// Define resolver functions
var root = {
    getUser: {
        firstName: () => 'John',
        lastName: () => 'Doe',
        email: () => 'John.Doe@gmail.com',
        socialMedia: {
          facebook: () => 'John Doe Facebook',
          instagram: () => 'John Doe Instagram',
          twitter: () => 'John Doe Twitter'
        }
    },
    getSocialMedia: {
        facebook: () => 'John Doe Facebook',
        instagram: () => 'John Doe Instagram',
        twitter: () => 'John Doe Twitter'
    }

 };

推荐阅读