npm 包 optional-conf 使用教程

阅读时长 8 分钟读完

简介

Optional-conf 是一个用于处理 Node.js 程序配置的 npm 包。它可以帮助开发者更加方便地管理项目的配置信息,支持从多种来源获取配置,例如从环境变量、命令行参数、配置文件中读取信息,并且支持校验和转换配置项数据类型。

安装

使用 npm 进行安装:

安装完成后,在项目中引入 optional-conf:

使用

使用 optional-conf 的第一步是定义配置项,在 optional-conf 中,一个配置项可以由四部分构成:

  • key: 配置项的名称,可以是任何字符串。
  • cli: 从命令行读入这个配置项的方式,默认是没有的,表示从命令行参数中不读入这个配置项的值。
  • env: 从环境变量读入这个配置项的方式,默认是没有的,表示从环境变量中不读入这个配置项的值。
  • default: 配置项的默认值,默认是没有的,表示如果命令行参数和环境变量中都没有这个配置项的值,那么就使用这个默认值。

下面的代码展示了如何定义一个配置项:

-- -------------------- ---- -------
----- ------ - --------------
  -
    ---- ----------
    ---- -------
    ---- ----------
    -------- ------
  --
  -
    ---- --------------
    ---- -----------
    ---- -------------
  -
---

在上面的代码中,我们定义了两个配置项,db_userdb_password,其中 db_user 这个配置项可以从命令行参数(使用 --user 参数传入)或者环境变量(使用 DB_USER 变量传入)中读取。如果这两个地方都没有找到 db_user 这个配置项,那么就使用默认值 root

获取配置值

在定义了配置项之后,就可以使用 config() 函数获取这些配置项的值了。调用 config() 函数会返回一个对象,这个对象包含了所有存在的配置项的值。

下面的代码中展示了如何使用 config() 函数获取配置项的值,并把这些配置项的值打印出来:

-- -------------------- ---- -------
----- ------ - --------------
  -
    ---- ----------
    ---- -------
    ---- ----------
    -------- ------
  --
  -
    ---- --------------
    ---- -----------
    ---- -------------
  -
---

----------------------

如果以上代码运行成功,它会打印出如下信息:

这表示只有 db_user 这个配置项的值被成功获取,并且它的值是默认值 root

校验和转换值

optional-conf 还提供了校验和转换配置项的值的功能。当定义配置项时,可以指定校验或转换的函数,这些函数会在获取配置项时自动执行。

下面的代码定义了两个配置项,portlog_level。其中 port 的值必须是一个数字,并且不能小于 1000 或者大于 9999。而 log_level 的值必须是字符串 'debug''info''warn''error' 中的一个。

-- -------------------- ---- -------
----- ------ - --------------
  -
    ---- -------
    ---- -------
    ---- -------
    -------- -----
    --------- ------- -- ----------------------- -- ----- -- ---- -- ----- -- ----
  --
  -
    ---- ------------
    ---- ------------
    -------- -------
    ---------- ------- -- --------------------
    --------- ------- -- --------- ------- ------- ------------------------
  -
---

在这个例子中,我们看到了两个新的配置项属性:validatetransformvalidate 属性接收一个函数作为参数,这个函数会在获取值时进行校验。如果校验函数返回 false,那么获取配置项值的过程会被停止,并且返回 undefined。而 transform 属性接收一个函数作为参数,这个函数会在获取值之后对其进行转换。

下面的代码演示了如何使用校验和转换函数:

-- -------------------- ---- -------
----- ------ - --------------
  -
    ---- -------
    ---- -------
    ---- -------
    -------- -----
    --------- ------- -- ----------------------- -- ----- -- ---- -- ----- -- ----
  --
  -
    ---- ------------
    ---- ------------
    -------- -------
    ---------- ------- -- --------------------
    --------- ------- -- --------- ------- ------- ------------------------
  -
---

----- - ----- --------- - - ---------
------------------ ---- ----------
-------------------- ------ ---------------

在以上代码运行成功后,它会打印出如下结果:

优先级

在获取配置项的值时,optional-conf 会按照以下优先级顺序去查找配置项的值:

  1. 命令行参数(如果存在)
  2. 环境变量(如果存在)
  3. 默认值

在优先级顺序中,如果前面的步骤找到了值,那么后面的步骤会被跳过。这表示如果命令行参数和环境变量中都存在某个配置项的值,那么使用的就是命令行参数中的值。

示例

下面的代码演示了如何使用 optional-conf 编写一个 HTTP 服务器。在这个例子中,我们使用了上文提到的全部特性:

-- -------------------- ---- -------
----- ---- - ----------------
----- ------------ - -------------------------

-- -----
----- ------ - --------------
  -
    ---- -------
    ---- -------
    ---- -------
    -------- -----
    --------- ------- -- ----------------------- -- ----- -- ---- -- ----- -- ----
  --
  -
    ---- ------------
    ---- ------------
    -------- -------
    ---------- ------- -- --------------------
    --------- ------- -- --------- ------- ------- ------------------------
  -
---

-- -------
----- - ----- --------- - - ---------

-- -- ---- ---
----- ------ - ----------------------- ---- -- -
  ------------------ - --------------- ------------ ---
  -------------- ----------
---

-- -----
------------------- -- -- -
  ------------------- --------- -- ---- ----------
  -------------------- ------ ---------------
---

在运行以上代码时,可以使用 --port 参数指定服务器监听的端口,使用 LOG_LEVEL 环境变量指定日志级别,如下所示:

在运行成功后,服务器会监听 8081 端口,并且日志级别为 debug。

结论

使用 optional-conf 可以帮助开发者更加方便地管理配置信息,提高开发效率。通过校验和转换函数,可防止配置项值的错误输入,提高代码健壮性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/600575c381e8991b448ea729

纠错
反馈