当前位置: 首页 > 知识库问答 >
问题:

构建GraphQL解析器以返回字符串列表--接收[object object]而不是字符串

甄文彬
2023-03-14

我正在开发一个使用GraphQL查询OrientDB图数据库的web应用程序。它使用Apollo服务器来解决传入的GraphQL查询。

{
  "data": {
    "allTopicNames": [
      "Topic 1",
      "Topic 2",
      "Topic 3",
      "Topic 4"
    ]
  }
}
// Imports: GraphQL
import { gql } from 'apollo-server-express';

// GraphQL: TypeDefs
const TYPEDEFS = gql`
type Query {
    allTopics: [Topic]
    topic(name: String): [Topic]
    allTopicNames: [String] //This is the new Type Definition -- we want a list of Strings
  }
type Topic {
    name: String
}
`;

// Exports
export default TYPEDEFS;

和关联的冲突解决程序:

//Connect to OrientDB
var OrientJs = require('orientjs');

var server = OrientJs({
    host: "localhost",
    port: "2424",
    username: "root",
    password: "root"
});

var db = server.use({
    name: 'database',
    username: 'root',
    password: 'root'
});

// GraphQL: Resolvers
const RESOLVERS = {
    Query: {
        allTopics: () => {
            return db.query('SELECT FROM Topic ORDER BY name');
        },
        allTopicNames: () => {
            return db.query('SELECT name FROM Topic ORDER BY name'); //This is the new resolver
        },
        topic: (obj, args) => {
            return db.query('SELECT FROM Topic WHERE name=\'' + args.name + '\' LIMIT 1');
        }
    }
};

// Exports
export default RESOLVERS;

但是,当我尝试实现上面的类型定义和解析器时,我收到了一个字符串列表,这些字符串都是“[object object]”,而不是实际的字符串:

{
  "data": {
    "allTopicNames": [
      "[object Object]",
      "[object Object]",
      "[object Object]",
      "[object Object]"
    ]
  }
}

我尝试向解析器添加一些代码,这些代码将遍历每个对象并创建要返回的正确字符串列表:

// GraphQL: Resolvers
const RESOLVERS = {
    Query: {
        allTopics: () => {
            return db.query('SELECT FROM Topic ORDER BY name');
        },
        allTopicNames: () => {
            let the_list_of_records = db.query('SELECT name FROM Topic ORDER BY name').then(res => { 
                let the_list_of_names = []; //We'll return a List of Strings using this
                for(var i = 0; i < res.length; i++){
                    the_list_of_names.push(res[i]['name']);
                }
                console.log(the_list_of_names);
                return the_list_of_names;
            });
        },
        topic: (obj, args) => {
            return db.query('SELECT FROM Topic WHERE name=\'' + args.name + '\' LIMIT 1');
        }
    }
};

但这并不起作用,而是返回了一个null值:

{
  "data": {
    "allTopicNames": null
  }
}

坦率地说,我很困惑为什么我不能通过这个解析器获得一个简单的字符串列表来填充。也许我遗漏了一些明显的东西--任何洞察力都是非常感激的!

共有1个答案

蒲寂离
2023-03-14

您最初的方法没有像预期的那样工作,因为您返回的是一个对象数组。第二次尝试返回null,因为您没有返回解析器中的任何内容。您的解析器应始终返回一个值或将解析为该值的promise,否则该字段的解析值将始终为NULL。

the_list_of_records的值将是一个promise,所以您只需返回该值就足够了。但是我们可以使用map使这段代码更容易阅读,如下所示:

allTopicNames: () => {
  return db.query('SELECT name FROM Topic ORDER BY name').then(res => {
    return res.map(topic => topic.name)
  })
}

// using async/await
allTopicNames: async () => {
  await topics = await db.query('SELECT name FROM Topic ORDER BY name')
  return topics.map(topic => topic.name)
}
 类似资料:
  • 问题内容: 我有一个字符串,其内容是XML。我想将标签分开,并使其成为Java中的字符串列表。以下是我正在尝试的东西: 我想将其分为以下列表: 我试图通过JAXB处理器执行此操作,但效果不佳。还使用split尝试了一些愚蠢的逻辑,但这也无济于事。还有其他方法可以做到这一点吗? 问题答案:

  • 我正在学习如何使用Spring靴和胸腺嘧啶。我有一个问题,我在表单列表中提供一个特定对象的列表到一个Thymeleaf页面。当用户选择值并发布结果时,结果是所选对象的字符串,并且与我想要存储值的对象不兼容。 这可能听起来像一口,所以下面是代码。 输入:一个类将一组成分传递给表单,这个类在一个类成分列表中传递给表单(过滤对此无关紧要--插入一个列表作为model属性的值,键是一种成分类型) Thym

  • 以下endpoint以字符串形式返回用户名。 我如何构造它以返回一个json对象,该对象包含一个键,该键的值为该字符串(例如,{“user”:“joeuser”})?

  • 问题内容: 我正在尝试使用Python 3的内置JSON模块进行一些简单的JSON解析,并且从阅读有关SO和谷歌搜索的其他问题来看,这似乎应该非常简单。但是,我想我得到的是返回的字符串,而不是预期的字典。 首先,这是我尝试从中获取值的JSON。这只是Twitter API的一些输出 我将此字符串分配给名为json_string的变量,如下所示: 然后,当我尝试从“杰森”字典中获取特定密钥时: 我收

  • 此函数接收字符串文本,并返回一个包含字符串列表的列表,字符串文本中的每个句子都有一个列表。 句子由一个字符串“.”分隔, "?",或者“!”.我们忽略了其他标点分隔句子的可能性。所以‘X先生’会变成2句,‘不要’是两个字。 例如,文本是 函数返回: 最令人困惑的部分是如何使函数检测字符?以及如何使其成为每个句子中包含单词的列表。非常感谢。

  • 问题内容: 我尝试将Jersey中的字符串列表作为JSON和XML返回。我认为这将是微不足道的。 我的第一次尝试是写这样的东西 而且我期望输出与此类似:[“ string1”,…,“ stringN]不幸的是,我得到了这个: 然后我为列表写了一个包装StringString 并将外观修改为 这对于包含超过1个项目的列表非常有用。 不幸的是,对于一个或零个元素,我得到了两个意外的结果 我做错什么了吗