如何从需要 return 语句的 GraphQL 解析器中调用异步 node.js 函数?

2023-12-21

上提供的 Hello World 示例graphql.org/graphql-js http://graphql.org/graphql-js创建一个简单的 GraphQL 实现如下:

var { graphql, buildSchema } = require('graphql');

// Construct a schema, using GraphQL schema language
var schema = buildSchema(`
    type Query {
        hello: String
    }
`);

// The root provides a resolver function for each API endpoint
var root = {
    hello: () => {
        return 'Hello World!';
    }
};

// Run the GraphQL query '{ hello }' and print out the response
graphql(schema, '{ hello }', root).then((response) => {
    console.log(response);
});

我正在尝试在解析器中运行异步函数,例如数据库调用,但我似乎不知道如何使其工作:

我正在尝试做的事情:

var { graphql, buildSchema } = require('graphql');

// Construct a schema, using GraphQL schema language
var schema = buildSchema(`
    type Query {
        data: String
    }
`);

// The root provides a resolver function for each API endpoint
var root = {
    data: () => {
        getData((data) => {
            return data;    // Returns from callback, instead of from resolver
        }
    }
};

// Run the GraphQL query '{ data }' and print out the response
graphql(schema, '{ data }', root).then((response) => {
    console.log(response);
});

我尝试过使用承诺,但似乎没有办法在不输入回调的情况下逃避承诺。我还尝试了各种包装异步的方法getData函数强制其同步,但最终必须从异步函数返回一个值,同样的问题。我觉得这不可能这么复杂,我的意思是 GraphQL-JS 是 Facebook 写的。


所以,在你弄清楚这个问题后,你会觉得这个问题非常愚蠢,但由于我花了很长时间与它斗争,我将回答我自己的问题,这样其他人就有希望受益。

事实证明 GraphQL 解析器函数必须返回一个值或解决该值的承诺。所以我想用这样的事情来做:

var { graphql, buildSchema } = require('graphql');

// Construct a schema, using GraphQL schema language
var schema = buildSchema(`
    type Query {
        data: String
    }
`);

// The root provides a resolver function for each API endpoint
var root = {
    data: () => {
        getData((data) => {
            return data;    // Returns from callback, instead of from resolver
        }
    }
};

// Run the GraphQL query '{ data }' and print out the response
graphql(schema, '{ data }', root).then((response) => {
    console.log(response);
});

可以用这样的方法来完成:

var { graphql, buildSchema } = require('graphql');

// Construct a schema, using GraphQL schema language
var schema = buildSchema(`
    type Query {
        data: String
    }
`);

let promiseData = () => {
    return new Promise((resolve, reject) => {
        getData((data) => {
            resolve(data);
        });
    });
};

// The root provides a resolver function for each API endpoint
var root = {
    data: () => {
        return promiseData();
    }
};

// Run the GraphQL query '{ data }' and print out the response
graphql(schema, '{ data }', root).then((response) => {
    console.log(response);
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从需要 return 语句的 GraphQL 解析器中调用异步 node.js 函数? 的相关文章

随机推荐

  • 如何让两个 JAR 在“docker run 容器”上自动启动

    我希望通过 run 命令调用 docker 容器后自动执行两个单独的 JAR 文件 因此当我输入docker run mycontainer他们都被称为 到目前为止 我有一个如下所示的 dockerfile base image is ja
  • 在文本框中搜索单词并将光标移动到文本框中的下一个匹配项?

    我目前有一个小部件 可以搜索我的主文本框并突出显示与我的搜索匹配的单词 我遇到的问题是找到一种方法将光标移动到找到的第一个匹配项 然后在下次按 Enter 时将光标移动到找到的下一个匹配项 我有两种方法可以在文本框中搜索单词 一种方法是查找
  • 如何使用 Greasemonkey 单击此按钮?

    我是 JS 的新手 我正在尝试单击此按钮 a class simplebutton href find a 该按钮的 XPath 是 html body div 5 div span 2 a 并且可以在以下位置查看目标页面的快照这个小提琴
  • CompositeTransform 只在 silverlight 中使用吗?

    CompositeTransform仅用于silverlight 我们是否可以在 WPF 中使用它或任何等效的替代品 没有CompositeTransform然而在WPF中有一个TransformGroup 因此 等效替换是Transfor
  • 使用 Text::CSV_XS 模块将列插入 Perl 中的 CSV 文件

    如何使用 Text CSV XS 模块将列添加到 CSV 文件 模块中的打印例程仅将数组写入一行 如果我有一个数组 如何将其作为列写入文件 我已经写了下面的代码 open my outFH gt outFile or die outFile
  • 如何将椭圆动画路径旋转一定角度?

    我使用以下方法来获取实体随时间沿椭圆路径行进时的 x 和 y 位置 x Math cos time width 2 y Math sin time height 2 有没有一种简单的方法可以将整个物体旋转一定的度数 例如 45 度或 132
  • KendoUI 集成到 Durandal JS

    我正在构建一个phonegap 应用程序 并计划使用 Telerik 的 Kendo UI 框架来生成 UI Telerik Kendo UI 已经有一个 MVVM 实现 我想使用它而不包括 Knockout JS 这是支持的东西 还是 D
  • 在 Webview 中清除用户的 Facebook 会话

    我有一个 WebView 它允许用户将图像分享到 Facebook 这个过程涉及他们登录 FB 完成后 我销毁 WebView 应用程序重置 并向不同的用户提供相同的功能 目的是让 WebView 不从一个会话到下一个会话保持登录状态 但是
  • 如何使用 Android SDK Manager 安装 NDK

    据说可以用Android SDK manager来安装NDK 如下图 不幸的是 我没有SDK Plantforms SDK Tools and SDK Update Sites我的 SDK 管理器中的选项卡 我的图片如下 那么我的情况如何安
  • 在设备树中注册 snd-soc-dummy

    我正在尝试在我的设备树源文件中注册 soc utils 中提供的 ALSA 虚拟编解码器 以将其与 i2s 设备驱动程序 sun8i i2s 一起使用 我尝试在 i2s 配置中设置 sound dai 字段 如下所述 https patch
  • PHP有peek数组操作吗?

    我想查看数组的第一个元素 此操作等效于以下代码 function peek list item array shift list array unshift list item return item 这段代码对我来说似乎真的很重 并且 p
  • 当我绘图时如何消除线条之间的这些“点”?

    is there an easy way to not draw this points in my lines I don t know why this points are there because i never release
  • 如何永久运行 Ionic 服务?

    我正在为一个应用程序使用 Ionic 框架 代码位于Linux服务器上 我正在使用运行应用程序ionic serve通过腻子命令 但是 问题是如果我关闭腻子 应用程序就会停止 有没有办法让离子服务作为守护进程永久运行 我怀疑您尝试这样做是因
  • IIS发布后如何修复CSS中的图像路径?

    我是 MVC V4 新手 在将网站发布到 IIS 后遇到问题 通过 Web 浏览器 和页面检查器 在 IIS Express 中查看时 我的网站运行良好 然而 当我将我的网站 通过 VS2012 发布到 IIS 时 我的 CSS 引用的所有
  • 无法显示png

    我正在虚拟机 Red Hat Enterprise Linux Server 版本 6 4 上运行 R shiny R 版本 3 0 1 2013 05 16 一切正常 即服务器启动 应用程序运行等 只要我不尝试绘制图表 renderPlo
  • 如何在 C++ 中使用复数“i”

    我现在正在编写一个简单的 DFT 算法 我想在复指数中使用复数 i 我看到有人用 include
  • 自定义 UIView 类 - Swift

    我已经构建了一个从底部出现并在一段时间后隐藏的视图 它运行良好 但我想将其放入UIView类作为模态 我浏览了互联网 但我无法理解或理解如何做到这一点 snake UIView frame CGRect x 0 y self view fr
  • driver.Context.synchronize()- 还有什么要考虑的 -- - 清理操作失败

    I have this https stackoverflow com questions 12159709 cuda out of memory threads and blocks issue address is out of bou
  • 在字符串中使用 switch

    尝试通过首先将字符串转换为字符然后应用开关来在字符串中使用开关 但仍然没有完成 这是我的代码 import java io BufferedReader import java io IOException import java io I
  • 如何从需要 return 语句的 GraphQL 解析器中调用异步 node.js 函数?

    上提供的 Hello World 示例graphql org graphql js http graphql org graphql js创建一个简单的 GraphQL 实现如下 var graphql buildSchema requir