确保 GraphQL ID 是 Mongo ObjectId
Ensure GraphQL ID is a Mongo ObjectId
我正在使用 Apollo Server 构建一个基于 graphql 的服务器,该服务器与 MongoDB 实例交互。我想这样做,如果客户端为具有 graphql 类型 ID 的字段传递值,则该值必须是有效的 mongo ObjectId(mongoose 有一个实用程序来检查这个我想想——这不是问题)。也就是说,如果该值不是有效的 ObjectId,我希望在 graphql 级别(即 400)得到验证错误。当我尝试将该值用作 ObjectId 时,我不想稍后在我的服务器中获得 500,并且我不想在服务器内的多个位置检查该值是否是有效的 ObjectId。
基本上我想在 graphql 级别为 ID 标量类型实现验证逻辑,如果这有意义的话。
您需要使用 custom scalar instead of ID
to get the sort of behavior you're looking for. You can write your own or use an existing one。
import { Kind, GraphQLError, GraphQLScalarType, ValueNode } from 'graphql';
const MONGODB_OBJECTID_REGEX = /*#__PURE__*/ new RegExp(/^[A-Fa-f0-9]{24}$/);
export const GraphQLObjectID = /*#__PURE__*/ new GraphQLScalarType({
name: 'ObjectID',
description:
'A field whose value conforms with the standard mongodb object ID as described here: https://docs.mongodb.com/manual/reference/method/ObjectId/#ObjectId. Example: 5e5677d71bdc2ae76344968c',
serialize(value: string) {
if (!MONGODB_OBJECTID_REGEX.test(value)) {
throw new TypeError(
`Value is not a valid mongodb object id of form: ${value}`,
);
}
return value;
},
parseValue(value: string) {
if (!MONGODB_OBJECTID_REGEX.test(value)) {
throw new TypeError(
`Value is not a valid mongodb object id of form: ${value}`,
);
}
return value;
},
parseLiteral(ast: ValueNode) {
if (ast.kind !== Kind.STRING) {
throw new GraphQLError(
`Can only validate strings as mongodb object id but got a: ${ast.kind}`,
);
}
if (!MONGODB_OBJECTID_REGEX.test(ast.value)) {
throw new TypeError(
`Value is not a valid mongodb object id of form: ${ast.value}`,
);
}
return ast.value;
},
});
我正在使用 Apollo Server 构建一个基于 graphql 的服务器,该服务器与 MongoDB 实例交互。我想这样做,如果客户端为具有 graphql 类型 ID 的字段传递值,则该值必须是有效的 mongo ObjectId(mongoose 有一个实用程序来检查这个我想想——这不是问题)。也就是说,如果该值不是有效的 ObjectId,我希望在 graphql 级别(即 400)得到验证错误。当我尝试将该值用作 ObjectId 时,我不想稍后在我的服务器中获得 500,并且我不想在服务器内的多个位置检查该值是否是有效的 ObjectId。
基本上我想在 graphql 级别为 ID 标量类型实现验证逻辑,如果这有意义的话。
您需要使用 custom scalar instead of ID
to get the sort of behavior you're looking for. You can write your own or use an existing one。
import { Kind, GraphQLError, GraphQLScalarType, ValueNode } from 'graphql';
const MONGODB_OBJECTID_REGEX = /*#__PURE__*/ new RegExp(/^[A-Fa-f0-9]{24}$/);
export const GraphQLObjectID = /*#__PURE__*/ new GraphQLScalarType({
name: 'ObjectID',
description:
'A field whose value conforms with the standard mongodb object ID as described here: https://docs.mongodb.com/manual/reference/method/ObjectId/#ObjectId. Example: 5e5677d71bdc2ae76344968c',
serialize(value: string) {
if (!MONGODB_OBJECTID_REGEX.test(value)) {
throw new TypeError(
`Value is not a valid mongodb object id of form: ${value}`,
);
}
return value;
},
parseValue(value: string) {
if (!MONGODB_OBJECTID_REGEX.test(value)) {
throw new TypeError(
`Value is not a valid mongodb object id of form: ${value}`,
);
}
return value;
},
parseLiteral(ast: ValueNode) {
if (ast.kind !== Kind.STRING) {
throw new GraphQLError(
`Can only validate strings as mongodb object id but got a: ${ast.kind}`,
);
}
if (!MONGODB_OBJECTID_REGEX.test(ast.value)) {
throw new TypeError(
`Value is not a valid mongodb object id of form: ${ast.value}`,
);
}
return ast.value;
},
});