如何从服务器执行 GraphQL 查询

Posted

技术标签:

【中文标题】如何从服务器执行 GraphQL 查询【英文标题】:How to execute GraphQL query from server 【发布时间】:2017-05-16 10:28:41 【问题描述】:

我正在使用 graphql-express 创建一个端点,我可以在其中执行 graphql 查询。虽然我将 Sequelize 与 SQL 数据库一起使用,但在我的 graphql resolve 函数之外直接从服务器使用它感觉不对。如何从定义的同一服务器查询我的 graphql API?

这就是我设置我的 graphql 端点的方式:

const express = require('express');
const router = express.Router();
const graphqlHTTP = require('express-graphql');
const gqlOptions = 
   schema: require('./schema')
;
router.use('/', graphqlHTTP(gqlOptions));

modules.exports = router;

基本上我想要的是能够做这样的事情:

query(`
  
    user(id: $id) 
      name
    
  
`)

如何创建这个query 函数?

【问题讨论】:

【参考方案1】:

GraphQL.js 本身不需要 http 服务器即可运行。 express-graphql 只是将查询解析器挂载到 http 端点的助手。

您可以将架构和查询传递给graphql,它会返回一个 Promise,它将查询解析为数据。

graphql(schema, query).then(result => 
  console.log(result);
);

所以:

const graphql = require('graphql');
const schema = require('./schema');
function query (str) 
  return graphql(schema, str);


query(`
  
    user(id: $id) 
      name
    
  
`).then(data => 
  console.log(data);
)

【讨论】:

要获得更多选项,请参阅github.com/graphql/graphql-js/blob/…的源代码 另外这里是graphql函数的官方文档页面:graphql.org/graphql-js/graphql/#graphql【参考方案2】:

我想通过提供正确执行带有参数的查询/突变的模式来完成@aᴍɪʀ 的答案:

const params = 
  username: 'john',
  password: 'hello, world!',
  userData: 
    ...
  


query(`mutation createUser(
          $username: String!,
          $password: String!,
          $userData: UserInput) 
  createUserWithPassword(
    username: $username,
    password: $password,
    userData: $userData) 
    id
    name 
      familyName
      givenName
    
  
`, params)

这样,您不必到处处理字符串构造位"'

【讨论】:

查询功能不也要改吗?您的调用传递了 2 个参数,而不是一个。

以上是关于如何从服务器执行 GraphQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何发送文件以响应 graphql 查询? (从服务器向客户端发送一个 csv 文件)

如何在 GraphQL 中执行突变?

如何从组件中抽象出一个 graphQL 查询?

如何将graphql查询的结果作为文件发送?

如何将 GraphQL 查询从 Node.js 发送到 Prisma

GraphQL + Relay:如何执行重新获取授权?