GraphQL不调用自定义标量方法

GraphQL不调用自定义标量方法,graphql,apollo,graphql-js,Graphql,Apollo,Graphql Js,和其他许多人一样,我正在尝试使用GraphQL和JavaScript创建自己的Datescalar。我读过很多例子,特别是遵循了这些例子 我所做的 将标量日期添加到我的模式中 使用serialize、parseValue和parseLiteral的实现创建了GraphQLScalArtType的实例。我调用了那个实例dateScalar 在解析器映射中添加了一个名为Date的新属性,其值为dateScalar 这将使我的日期可以根据我所读的内容使用。但是,每次执行查询时得到的值与存储在数据库

和其他许多人一样,我正在尝试使用GraphQL和JavaScript创建自己的
Date
scalar。我读过很多例子,特别是遵循了这些例子

我所做的
  • 将标量日期添加到我的模式中
  • 使用serialize、parseValue和parseLiteral的实现创建了
    GraphQLScalArtType
    的实例。我调用了那个实例
    dateScalar
  • 在解析器映射中添加了一个名为
    Date
    的新属性,其值为
    dateScalar
这将使我的
日期
可以根据我所读的内容使用。但是,每次执行查询时得到的值与存储在数据库中的值完全相同。如果那是一个字符串,我看到一个字符串,如果那是一个数字,我看到一个数字。它在任何时候都不会被解析或序列化

这就是我的文件的样子

schema.js

const{buildSchema}=require('graphql');
const schema=buildSchema(`
标量日期
#更多模式
`);
module.exports=schema;
root.js

const{dateScalar}=require('./customScalars');
常数根={
//询问
//突变
//标量
日期:dateScalar
};
module.exports=root;
customScalars.js

const{GraphQLScalarType}=require('graphql');
const dateScalar=new GraphQLScalarType({
姓名:'日期',
description:'这是js日期的标量版本',
序列化(值){
log('callserialize');
返回值。getTime();
},
解析值(value){
log('callparsevalue');
返回新日期(值).getFullYear();
},
parseLiteral(ast){
log('callparseliteral');
返回;
}
});
module.exports={
日期标量
};
server.js

const express=require('express');
常量graphqlHTTP=require('express-graphql');
const schema=require('./graphql/schema.js');
const graphqlRoot=require('./graphql/root.js');
var-app=express();
app.use('/endpoint',graphqlHTTP({
schema:schema,
graphiql:是的,
rootValue:graphqlRoot,
}));
app.listen(3333,()=>console.log('现在浏览到localhost:3333/endpoint');
我的调试到目前为止
  • 我使用了方法
    serialize
    等的日志,但没有调用任何方法
  • 我已经从根目录中删除了
    Date
    属性,行为完全相同
  • 我已经检查了
    dateScalar
    的实例是否符合我的预期。我是通过在不同文件中导入后调用
    console.log(dateScalar.serialize(new Date().getTime())
    来完成的。当这样做时,我会得到日志,告诉我调用了serialize,结果就是我所期望的
在根目录下,它似乎从未将模式中的标量与自定义标量实例相链接。也许我做错了什么

我猜GraphQL正在使用
.toString()
进行序列化和解析,因为它找不到我的序列化/解析实现

关于如何让GraphQL使用我的自定义标量有什么想法吗?

tl;博士 使用
graphql工具
创建可执行架构,并使用
apollo server express
而不是
express graphql


不幸的是,我不熟悉
expressgraphql
。因此,我的解决方案需要使用apollo server express重新编译它。幸运的是,它不需要太多的更改

这就是我的工作原理,经过一些修改以匹配您的代码

首先安装软件包:
npm安装apollo server express graphql工具

下面是代码:

const {makeExecutableSchema} = require('graphql-tools')
const {graphqlExpress} = require('apollo-server-express');

const graphqlRoot = require('./graphql/root.js');

//...

const schemaDef = `
  scalar Date

  # more schema
`;

//build the schema
const schema = makeExecutableSchema({
  typeDefs: [schemaDef],
  resolvers: graphqlRoot
});

// your new endpoint:
app.use('/endpoint', bodyParser.json(), graphqlExpress({ schema }));
阅读更多关于


此外,使用Apollo可以轻松地拥有多个模式文件和解析器文件,而无需担心手动组合它们。下面是文档中的一个解释:

您写道“在根目录中添加了一个名为Date的新属性”。不确定这里的“根”是什么。它是一个解析器映射吗?还是别的什么?你能在这里复制根目录的相关部分以及你如何设置graphqlpoptions.schema吗?@talzaj-Oh这是一个很好的观点。它实际上是解析器映射,但我没有意识到root不是它的常用行话。我将编辑问题,添加一些代码,以便能够清楚地理解。谢谢我昨天在我的服务器上成功地实现了它。因此,如果您仍然有问题,我可以将您的代码与适合我的代码进行比较。这听起来很棒。我需要我的个人笔记本电脑来获取我写的代码,以便能够更新这篇文章。希望今晚我能抽出时间做这件事。谢谢@talzaj我刚刚更新了帖子。如果你需要更多信息,请告诉我。谢谢我会尽快尝试这一点,并接受你的答案,一旦我有它的工作。谢谢你的回答!:)向阿波罗图书馆过渡似乎需要做大量的工作。我找不到办法让它工作。现在我得到了错误“Expected undefined to a GraphQL schema”,所有堆栈跟踪点都指向节点库文件。能否发布代码,包括设置端点的位置,调用
graphqlExpress
,使用参数和分配模式的代码?