353 words
2 minutes
[Effect Config] 02. Effect中的Config服务

Effect中的Config服务#

https://github.com/typeonce-dev/effect-getting-started-course

TIP

Config服务介绍

Effect 提供了一个可组合的服务来处理配置值:Config

Config 负责提取配置值并在我们的代码中提供它们。在我们的示例中,我们使用 Config.string 为 PokéApi 基础 URL 创建一个 Config

Config.string 接受一个 string 参数,该参数指定要提取的配置值的键("BASE_URL"):

import { Config } from "effect";

const config = Config.string("BASE_URL");

然后可以在 .gen 内部像普通的 Effect 一样使用 Config。我们首先更新 fetchRequest 以接受一个 baseUrl 参数:

const fetchRequest = (baseUrl: string) =>
  Effect.tryPromise({
    try: () => fetch(`${baseUrl}/api/v2/pokemon/garchomp/`),
    catch: () => new FetchError(),
  });

然后我们从 config 中提供它:

const config = Config.string("BASE_URL");

const program = Effect.gen(function* () {
  const baseUrl = yield* config;
  const response = yield* fetchRequest(baseUrl);
  if (!response.ok) {
    return yield* new FetchError();
  }

  const json = yield* jsonResponse(response);

  return yield* decodePokemon(json);
});
IMPORTANT

配置提取的副作用性质

由于提取配置是一个可能失败的副作用操作,使用 Config 需要 yield*

它还会将 ConfigError 添加到 program 类型的错误联合中。

program 现在的类型是 Effect<Pokemon, FetchError | JsonError | ParseError | ConfigError>

看到在类型签名中包含所有错误是多么方便吗?🚀

WARNING

ConfigError处理建议

由于缺少配置值是一个实现错误,通常不处理 ConfigError(不对其使用 catchTag)。

相反,通常最好让应用程序失败,因为我们无法从这类错误中恢复(你应该修复你的配置!)。