80-Nodejs课程2023:资源:默认值
#typescript #node #mongodb #fastify

有时,值未完全传递,因此,如果它们在给定的资源数据中缺少它们,我们需要为其设置默认值。

默认值

默认值基本上是值,如果给定资源数据没有我们要使用的密钥,将使用。

这个怎么运作

因此,我们将仅定义一个名为defaults的属性,这只是一个普通对象,包含一个要用作输出的键,该密钥的值将是默认值。

就是这样!

例子

现在打开我们的user-resource.ts文件并添加以下代码:

// src/app/users/resources/user-resource.ts
import Resource from 'core/resources/resource';
import { uploadsUrl } from 'core/utils/urls';

export default class UserResource extends Resource {
  /**
   * Output shape
   */
  protected output: any = {
    id: 'number',
    name: 'string',
    email: 'string',
    age: 'number',
    avatar: uploadsUrl,
    createdBy: UserResource,
 };

  /**
   * Defaults when key is missing from resource
   */
  protected defaults = {
    name: "John Doe",
    image: "users/my-image.jpg",
  };
}

我们在这里定义了一个名为defaults的新属性,我们定义了一个键name,其默认值为John Doe,我们定义了一个键image,其默认值为users/my-image.jpg

,但是当然它不会像我们不像往常一样实施,所以让我们这样做。

执行

现在打开我们的基本资源类,我们将添加以最初用空对象定义的defaults属性,然后在我们的转换方法中,我们将添加另一个检查,如果键在资源中不存在,我们,我们'll检查它是否存在于defaults属性中,如果存在,我们将使用它,否则我们将使用missingKey符号。

// src/core/resources/resource.ts
import { get } from "@mongez/reinforcements";

// this will be used to skip the output property if it is missing from the given resource
const missingKey = Symbol("missing");

export default class Resource {
  /**
   * Output shape
   */
  protected output: any = {};

  /**
   * Defaults when key is missing from resource
   */
  protected defaults: any = {};

  /**
   * Constructor
   */
  public constructor(protected resource: any = {}) {
    //
  }

  /**
   * {@inheritDoc}
   */
  public toJSON() {
    // final output
    const data: Record<string, any> = {};

    // loop through the output property
    for (const key in this.output) {
      // get the value type
      const valueType = this.output[key];
      // get the value, and also make sure to skip the output property if it is missing from the given resource

      // check that other                 👇🏻 get to check if the key exists in the defaults object
      let value = get(this.resource, key, get(this.defaults, key, missingKey));

      // skip the output property if it is missing from the given resource
      if (value === missingKey) {
        continue;
      }

      if (typeof valueType === "string") {
        // cast the value
        value = this.cast(value, valueType);
      } else if (valueType.prototype instanceOf Resource) {
        // if the value type is a resource, then pass the value to it
        value = new valueType(value).toJSON();
      } else if (typeof valueType === "function") {
        // call the custom output handler
        value = valueType(value);
      }

      // just for now sett the output value to the data
      data[key] = value;
    }

    return data;
  }
}

我们在这里更改的所有内容是get函数的第三个参数,而不是传递missingKey符号,我们将传递另一个get函数,但是这次将在defaults属性中进行搜索,如果键存在于defaults中。属性,它将返回该值,否则它将返回missingKey符号。

现在尝试在您的代码中尝试一下,您会看到nameimage键将在输出中添加到其默认值中,如果您不在资源数据中传递它们。

- 结论

在本课程中,我们学会了如何在给定资源数据中缺少输出键的默认值。

â•给我买一杯咖啡。

如果您喜欢我的文章并看到对您有用,则可以buy me a coffee,它将帮助我继续前进并继续创建更多内容。

ð项目存储库

您可以在Github

上找到此项目的最新更新

ð加入我们的社区

加入我们的社区Discord获得帮助和支持(节点JS 2023频道)。

ð视频课程(阿拉伯语)

如果您想以视频格式学习此课程,则可以在Youtube上找到该课程,该课程是阿拉伯语。

ð奖励内容ð

您可能会看这些文章,这肯定会提高您的知识和生产力。

一般主题

软件包和库

React JS软件包

课程(文章)