如何使用传递给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 来解析查询