Я столкнулся с новым типом бессмысленных ошибок (Expected type Int, found Int
) при выполнении запросов с входными параметрами (не только Ints). Похоже, они появились с начала июня (когда я обновился до graphql@14.3.1
?)
Наши настройки немного отличаются, поскольку мы привязываем удаленную схему к локальной (перекрывающиеся типы, если они существуют, или добавляем их, когда их нет).
Кто-нибудь видел этот тип ошибок и знает, как его исправить?
Я отследил проблему до метода parseLiteral файла scalar.js. В данном случае ast.kind равен EnumValue
, а его значение равно IntValue
var GraphQLInt = new _definition.GraphQLScalarType({
name: 'Int',
description: '...',
serialize: serializeInt,
parseValue: coerceInt,
parseLiteral: function parseLiteral(ast) {
if (ast.kind === _kinds.Kind.INT) {
var num = parseInt(ast.value, 10);
if (num <= MAX_INT && num >= MIN_INT) {
return num;
}
}
return undefined;
}
});
Кажется, что синтаксический анализатор произвольно преобразует значение 10
в EnumValue
(типа Int
), а не IntValue
.
Вот типичный запрос
combinedStatus(status: "bad", start:10, end:20) {
status
timestamp
}
Я получаю следующую ошибку: GraphQLError: Expected type Int, found Int.
в isValidScalar ./node_modules/graphql/validation/rules/ValuesOfCorrectType.js:180:27
тот же запрос с переменными вернет ожидаемый результат без ошибок:
combinedStatus(status: "bad", start:$start, end:$end) {
status
timestamp
}
Схема:
type CdsHealthCheckLocal implements CdsHealthCheckInterface {
status: String!
combinedStatus(status: String, start: Int, end: Int): CdsHealthCheck
}
и соответствующий резольвер:
async (parent, { status, start, end }, context) => {
return {
status: `not sure if I am feeling ${status} (${start}, ${end})`
}}