我如何使自定义标量类型在图形池?



我正在尝试创建一个名为JSONObject的自定义标量类型,该类型将应用于一个输入参数,该参数将接受json格式的文档数组,我无法让它工作。

该类型将进入图形开发界面,但该类型必须不能准确地描述我认为它正在描述的内容,因为它说它期望字段是我定义的名为JSONObject的类型。我甚至尝试过创建一个类型,它将接受任何不是null或未定义的东西,并且它仍然以相同的方式运行。

<标题>代码:

标量输入和输出

这不会改变任何例子

Scalars: {
Date: {
Input: Date;
Output: Date;
};
mongoId: {
Input: ObjectId;
Output: ObjectId;
};
JSONObject: {
Input: any;
Output: any;
};
objectIdOrEmpty: {
Input: ObjectId | Empty;
Output: ObjectId | Empty;
};
};

使用预制标量

// implementing a premade graphql scalar
builder.addScalarType('mongoId', ObjectIDResolver, {});
builder.addScalarType('Date', DateTimeResolver, {});
// the new one that didn't work
builder.addScalarType('JSONObject', JSONResolver, {});

尝试#1自定义标量:

builder.scalarType('JSONObject', {
serialize: (value) => {
let o = JSON.parse(JSON.stringify(value));
if (o && o._id) {
return o
} else {
throw new Error('Not a valid JSON Object');
}
},
parseValue: (value) => {
if (typeof value === 'object') {
return value
} else
throw new Error('Invalid value for Json Type Custom Scalar');
}
})

尝试让它接受任何值:

builder.scalarType('JSONObject', {
serialize: (value) => {
return value;
},
parseValue: (value: any) => {
if (value !== null && value !== undefined) {
return value;
}
else {
throw new Error('JSONObject cannot represent non-object value: ' + value);
}
}
})

重申一下,我想为突变中的参数输入创建一个char类型,该类型将接受这样的对象:

[{ 
"weight": 0, 
"spotsAvailable": [{ "userId": "empty", "name": "empty" }, { "userId": "67fd6sdhfds7yf87", "name": "John" }]
}, { 
"weight": 0, 
"spotsAvailable": [{ "userId": "empty", "name": "empty" }, { "userId": "67fd6sdhfds7yf87", "name": "John" }] }]

这是突变

createEvent: t.fieldWithInput({
input: {
longitude: t.input.float({ required: true }),
latitude: t.input.float({ required: true }),
name: t.input.string({ required: true }),
date: t.input.field({ type: 'Date', required: true }),
description: t.input.string({ required: true }),
cost: t.input.string(),
link: t.input.string(),
// 
// We need to get weights working here
// 
weights: t.input.field({ type: 'JSONObject' })
},
type: EventType,
resolve: (_, { input: { longitude, latitude, name, date, description, cost, link, weights, }, argWeights }, context) => {
const location: Location = {
type: 'Point',
coordinates: [longitude, latitude]
}
let anObject = {
createdBy: context.currentUser._id as ObjectId, location, name, date, description,
cost: cost ? cost : undefined, link: link ? link : undefined, weights: argWeights ? argWeights : undefined,
}
return dbMutations.createEvent(anObject);
}
}),

我的问题是,如果您定义一个参数输入而不是常规字段类型,则需要创建一个arg类型。我为自定义标量类型所做的并没有错,但它定义了一个参数,而不是标量。

我没有定义JSON类型的最佳解决方案,但我可以给出一个自定义标量如何工作的例子

标量:

// this is where you can modify the data before passing it to the actual parse function
builder.scalarType('JSONObject', {
serialize: (value) => {
return value;
},
// this is where you return the value or an error if it doesn't meet your requirements 
parseValue: (value: any) => {
if (value !== null && value !== undefined) {
return value;
}
else {
throw new Error('JSONObject cannot represent non-object value: ' + value);
}
}
})

还必须在构建器属性

中定义标量
Scalars: {
Date: {
Input: Date;
Output: Date;
};
mongoId: {
Input: ObjectId;
Output: ObjectId;
};
JSONObject: {
Input: any;
Output: any;
};
};
// I gave extra examples for clarity

最新更新