nodejs中的graphQL问题,在graphQL中为自定义类型返回null

时间:2017-03-30 16:20:10

标签: node.js graphql

我目前正在使用nodejs探索graphQL,我正在尝试构建一个简单的示例,如下所示:

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

var schema = buildSchema(`
type Query {
getUser(jid: String ): [User],
albums:[Album],
}

type User{
name:String,
image:String,
albums:[Album]
}

type Album{
name:String,
image:String
}

`);

class Album {
    constructor() { }
    name() { return 'ablum name' }
    image() { return 'image url' }
}

class User {
    constructor(jid) {
        this.jid = jid;
        console.log(this.jid);

    }
    ablums() {

        return [new Album, new Album];

    };
    name() {
        console.log(this.jid);
        return "name";
    }
    image() { return "url"; }
}

var root = {

    getUser: function ({ jid }) {
        return [new User(jid), new User(jid)];
    },

};

var app = express();
app.use('/graphql', graphqlHTTP({
    schema: schema,
    rootValue: root,
    graphiql: true,
}));
app.listen(4000);
console.log('Running a GraphQL API server at localhost:4000/graphql');

我期待一个带有两个用户阵列的JSON结果,每个用户阵列包含另外两个包含它的名称和图像的专辑数组。但是我在“专辑”字段中显示为null,该字段应显示包含名称和图像字段的两个专辑的数组。

{
"data": {
"getUser": [
  {
    "name": "name of abc is michael",
    "image": "url",
    "albums": null
  },
  {
    "name": "name of abc is michael",
    "image": "url",
    "albums": null
  }
 ]
}
}

请帮忙!我是graphQL的新手,我认为这是一项非常有用的技术!

2 个答案:

答案 0 :(得分:0)

这是您的用户类的拼写错误,您的方法称为ablums但您的查询正在查找名为albums的方法/属性,该方法/属性不存在,因此返回null。

答案 1 :(得分:0)

这是一个使用Hasura的现有服务器使用Node的示例(顺便说一句)。以下代码仅用于从Hasura / Postgres模式(或任何GraphQL服务器)获取JSON响应。一旦将数据放入变量中,就可以使用express服务。我正在为此工作,但可能会有几个示例。我可以稍后分享。还要检查Hasura订阅,它使用了开箱即用的实时通信,因此数据库上的每个更改都发送给客户端。这是链接:https://github.com/hasura/nodejs-graphql-subscriptions-boilerplate

在此示例中,只需更改gql查询以匹配您的架构和查询即可。

希望这对您有帮助。

var { ApolloClient } = require('apollo-client');
var { InMemoryCache } = require('apollo-cache-inmemory');
var { HttpLink } = require('apollo-link-http');
var fetch = require('node-fetch');

const cache = new InMemoryCache();
const link = new HttpLink({
  uri: 'http://localhost:8081/v1/graphql/', fetch: fetch
});

const client = new ApolloClient({
  cache,
  link
});
const gql = require('graphql-tag');

var query = gql`
query planeacion {
    lineas (where: { linea : { _eq: "123" }}){
    descripcion
    linea
  }
}

`
client
  .query({
    query: query
  })
  .then(result => console.log(JSON.stringify(result.data)));