如何使用传递给Graphql字段的参数来转换JS中的结果?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用传递给Graphql字段的参数来转换JS中的结果?相关的知识,希望对你有一定的参考价值。

我希望做类似于graphql教程中所做的事情:https://graphql.org/learn/queries/#arguments

这是我的架构

type Query{
        author(id:Int!):author
        authors:[author]
        books:[book]
        book(id:Int!):book
    }

    type author{
        id:Int!
        name:String
        surname: String
    }
    enum currency{
        EUR
        US
        }

    type book{
        id:Int!
        title:String!
        authors:[author]
        published:String
        price(unit: currency = EUR):Float
    }

    schema{
        query:Query
    }

我想转换货币,但我不知道我如何连接我的函数与此返回类型,以返回转换后的值。

完整的server.js

const express=require('express');
const axios = require('axios');
const express_graphql = require('express-graphql');
var {buildSchema} = require('graphql');


var schema = buildSchema(`
    type Query{
        author(id:Int!):author
        authors:[author]
        books:[book]
        book(id:Int!):book
    }

    type author{
        id:Int!
        name:String
        surname: String
    }
    enum currency{
        EUR
        US
        }

    type book{
        id:Int!
        title:String!
        authors:[author]
        published:String
        price(unit: currency = EUR):Float
    }

    schema{
        query:Query
    }
`)

var getAuthors = function(args){
    return axios.get('http://localhost:1234/Authors').then(res => res.data);
}

var getAuthor = function(args){
    return axios.get('http://localhost:1234/Authors/'+args.id).then(res => res.data);
}

var getBooks = function(args){
    return axios.get('http://localhost:4321/Books').then(res => res.data);
}

var getBook = function(args) {
    return axios.get('http://localhost:4321/Books/'+args.id).then(res => res.data);
}

var root = {
    author:getAuthor,
    authors:getAuthors,
    books:getBooks,
    book:getBook
}

const app=express();
app.use('/graphql', express_graphql({
    schema,
    rootValue: root,
    graphiql: true
}));

function convertCurrency(Eur, unit){
   if(unit==="EUR"){
       return Eur;
   }

   if(Unit === "US"){
       return Eur * 1.11;
   }
}

app.listen(8080, ()=>{
    console.log('server is running on port 8080..')
})
答案

你需要为price字段提供一个解析器,它看起来像这样:

(parent, args) => convertCurrency(parent.price, args.unit)

不幸的是,buildSchema不允许您创建功能齐全的架构。通常,您可以为要为其提供解析逻辑的任何字段定义resolve函数(或解析器),但buildSchema会创建一个没有任何解析器的模式。通过根值传递假解析器是a bit of hackery试图解决这个问题,但它有它的限制。

您有两种选择:

  • 通过自己构造GraphQLSchema对象以编程方式创建模式。
  • 继续使用模式定义语言(SDL)来定义模式,但切换到使用makeExecutableSchema中的graphql-tools

以上是关于如何使用传递给Graphql字段的参数来转换JS中的结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GraphQL 突变中使用 FaunaDB 将数组传递给字段

如何在反应js中将graphql列表传递给apollo中的突变

graphql.GraphQLSchema:使用啥类型的参数来获取查询以传递给 mongo db.collection.find 来解析查询

GraphQL.js Node/Express:如何将对象作为 GraphQL 查询参数传递

GraphQL - 将 ObjectType 传递给参数

如何在graphql中获取响应中的所有字段而不在查询中传递任何字段名称