Пользовательский скаляр на сервере Аполлон - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь определить пользовательский скаляр на сервере apollo, пока вот что у меня есть

Пользовательский скалярный файл (timestamp.js)

import { isRFC3339 } from 'validator';
import { GraphQLScalarType } from 'graphql';

export default new GraphQLScalarType({
  name: 'Timestamp',
  description: 'RFC3339 Timestamp format',
  serialize(value) {
    if (isRFC3339(value)) {
      return value;
    }
    throw new Error('Timestamp cannot represent an invalid RFC-3339 Timestamp string');
  },
  parseValue(value) {
    if (isRFC3339(value)) {
      return value;
    }
    throw new Error('Timestamp cannot represent an invalid RFC-3339 Timestamp string');
  },
  parseLiteral(ast) {
    if (isRFC3339(ast.value)) {
      return ast.value;
    }
    throw new Error('Timestamp cannot represent an invalid RFC-3339 Timestamp string');
  }
});

В моей схеме,моя схема находится в нескольких файлах, но я соединяю их вместе, прежде чем передать их в makeExecutableSchema.

scalar Timestamp

В файле, в котором есть makeExecutableSchema, которая позже экспортируется, и пользователь в конструкторе моего сервера.

import timeStamp from './scalars/timeStamp';
.
.
.
.
const schema = {
  typeDefs: [
    myTypeDefs
  ],
  resolvers: merge(
    resolvers,
    timeStamp
  ),
};

export default makeExecutableSchema({
  typeDefs: schema.typeDefs,
  resolvers: schema.resolvers
});

Я не знаю, чего мне не хватает, потому что у меня возникает эта ошибка при попытке запустить мой API

throw new _1.SchemaError("\"" + typeName + "\" defined in resolvers, but has invalid value \"" + resolverValue + "\". A resolver's value " +
            ^

Error: "name" defined in resolvers, but has invalid value "Timestamp". A resolver's value must be of type object or function.

Любая помощь будет принята с благодарностью.Заранее спасибо!

1 Ответ

1 голос
/ 23 апреля 2019

При построении схемы с использованием apollo-server (или graphql-tools) параметр resolvers должен быть объектом, свойства которого либо

  • имя типа выходного объекта в вашей схеме
  • имя (пользовательского) скалярного типа
  • имя типа enum

Другими словами, результирующий объект должен выглядеть примерно так:

const resolvers = {
  Query: {
    // field resolvers here...
  },
  // Maybe some other object types here...
  Timestamp: timeStamp,
}

Обратите внимание, что для наших пользовательских скаляров имя свойства должно соответствовать имени, которое мы указали для скаляра. Это также имя, которое вы включаете в typeDefs. В этом случае свойство будет Timestamp, и мы установим для него значение GraphQLScalarType, которое мы создали.

Итак, предполагая, что ваша фактическая resolvers переменная правильно отформатирована, вам нужно сделать:

merge(
  resolvers,
  { Timestamp: timeStamp }
)

Кроме того, вы также можете изменить экспорт по умолчанию для timeStamp ...

export default { Timestamp: new GraphQLScalarType(...) }

или просто отказаться от использования merge в целом с использованием синтаксиса распространения:)

resolvers: {
  ...resolvers,
  Timestamp: timeStamp,  
}
...