GraphQL自定义DateScalar标量实现正确性技术咨询
GraphQL自定义DateScalar标量实现检查与修正
原实现存在的问题
- resolvers.js 配置错误:自定义标量的解析器格式不符合规范,不应将标量嵌套在对象中,需直接赋值标量实例
- dateScalar.js 依赖缺失:未导入
GraphQLScalarType和Kind,运行时会抛出引用错误 - 类型转换存在隐患:
parseLiteral中直接将字符串时间戳传入new Date,建议转为数字类型避免解析异常 - serialize 方法鲁棒性不足:未校验输入是否为Date对象,若传入非Date值会导致
getTime()调用失败
修正后的代码实现
resolvers.js
const { DateScalar } = require("./dateScalar"); const resolvers = { DateScalar, }; module.exports = resolvers;
dateScalar.js
const { GraphQLScalarType, Kind } = require("graphql"); module.exports = { DateScalar: new GraphQLScalarType({ name: "DateScalar", description: "自定义日期标量,基于时间戳完成序列化与反序列化", // 处理客户端传入的变量值(如mutation参数) parseValue(value) { // 兼容时间戳数字、时间戳字符串、ISO格式字符串 return new Date(value); }, // 处理GraphQL查询字符串中的字面量值 parseLiteral(ast) { if (ast.kind === Kind.INT) { // 将字符串时间戳转为数字后创建Date对象 return new Date(parseInt(ast.value, 10)); } // 非INT类型字面量返回null,也可根据需求抛出错误 return null; }, // 将服务端的Date对象序列化为时间戳返回给客户端 serialize(value) { // 校验输入类型,避免非Date值导致报错 if (!(value instanceof Date)) { throw new Error("DateScalar serialize 仅接受Date类型值"); } return value.getTime(); }, }), };
typeDef.js
const { gql } = require("apollo-server-express"); const typeDefs = gql` scalar DateScalar type Item { # 建议字段名使用小驼峰命名规范(可选,非强制错误) date: DateScalar } `; module.exports = typeDefs;
补充说明
- 自定义标量的核心是实现
parseValue(处理变量)、parseLiteral(处理查询字面量)、serialize(处理返回序列化)三个方法 - 若需要支持ISO格式字符串作为查询字面量,可扩展
parseLiteral逻辑,增加Kind.STRING类型判断并验证日期有效性 - 字段名采用小驼峰是GraphQL通用命名规范,能提升代码可读性与一致性
内容的提问来源于stack exchange,提问作者CCS_GSQ
相关产品推荐
相关产品推荐

