81-Nodejs课程2023:资源:使用数组
#typescript #node #mongodb #fastify

如果我们的输出不仅包含一个值,还包含一个值数组?例如,我们正在返回保留图像列表的images,我们如何使用uploadsUrl函数返回它?

这是我们的文章要谈论的地方,任何形式的数组。

数组

这里的概念实际上很简单,我们只需检查值是否为数组,然后我们将其循环并应用其转换功能,否则只需将转换功能应用于值。

但是,由于我们已经进行了多次检查,例如valueType是字符串,然后进行构建铸件,如果它的功能,则将其调用,如果是资源,则将其解析,所以让我们将所有这些检查组入所有这些检查一种方法,因此当值仅一个值或其数组时,我们可以调用它。

变换值

我们将创建一个新方法,我们将其称为transformValue,它基本上将接收两个参数,即值和值类型,并且根据值类型,我们可以决定如何转换值。

// src/core/resources/resource.ts

// ...

  /**
   * Transform value
   */
  protected transformValue(value: any, valueType: any) {
    if (typeof valueType === "string") {
      value = this.cast(value, valueType);
    } else if (valueType.prototype instanceof Resource) {
      value = new valueType(value);
    } else if (typeof valueType === "function") {
      value = valueType.call(this, value);
    }

    return value;
  }

此方法基本上做了我们之前做过的完全相同的事情,但是我们只是以单独的方法将其移动。

您可能会注意到valueType如果它是一个函数,我将其更新以使用call只是将资源对象绑定到this中,如果值类型函数与当前资源类相关,则可以很有用。

现在让我们更新我们的toJSON方法以使用此新方法。

// src/core/resources/resource.ts

// ...

/**
 * {@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
            let value = get(this.resource, key, missingKey);

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

            // just for now sett the output value to the data
            data[key] = this.transformValue(value, valueType);
        }

        return data;
    }

我们替换了使用新方法transformValue,这将首先使我们的代码清洁器,还允许我们在值为数组时使用该方法。

// src/core/resources/resource.ts

// ...


/**
 * {@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
            let value = get(this.resource, key, missingKey);

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

            // check if value is an array
            if (Array.isArray(value)) {
                value = value.map((item) => this.transformValue(item, valueType));
            } else {
                // transform single value
                value = this.transformValue(value, valueType);
            }
        }

        return data;
    }

就是这样,现在我们可以传递一个值或单个值的列表,并不重要,它将始终相应地转换。

- 结论

我们在本文中做了两件事,我们创建了一个新方法transformValue,它将转换一个值,我们还更新了我们的toJSON方法以使用此新方法,还检查该值是否为数组,如果然后,我们将在它上循环并应用每个项目的转换。

â•给我买一杯咖啡。

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

ð项目存储库

您可以在Github

上找到此项目的最新更新

ð加入我们的社区

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

ð视频课程(阿拉伯语)

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

ð奖励内容ð

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

一般主题

软件包和库

React JS软件包

课程(文章)