簡體   English   中英

確保 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 標量類型實現驗證邏輯。

您需要使用自定義標量而不是ID來獲得您正在尋找的那種行為。 您可以自己編寫或使用現有的

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;
  },
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM