【问题标题】:Is there a better way to access array data in package.json有没有更好的方法来访问 package.json 中的数组数据
【发布时间】:2018-10-11 20:56:21
【问题描述】:

我的 package.json 中有一些 sn-p 配置:

{
    "name": "who-rules-app",
    "config": {
        "foo": "bar",
        "words": [
            "tpr",
            "rules"
        ]
    },
    "scripts": {
        "start": "node src/index.js"
    }
}

据我所知,人们通常使用process.env['npm_package_${keyname}'] 访问config 键,例如:

process.env['npm_package_config_foo']
//> "bar"

但是当值是一个数组时,你会得到一组扁平的编号键:

process.env['npm_package_config_words_0']
//> "tpr"
process.env['npm_package_config_words_1']
//> "rules"

我总是可以使用fs 从磁盘读取文件,但我的理解是通过process.env 执行操作允许这些东西与环境变量交互,这是处理跨不同环境的配置的一种非常好的方法。

理想情况下,我希望:

process.env['npm_package_config_words']
//> [ "tpr", "rules" ]

有没有更好的方法?那里有一个经过良好测试的模块?很酷的模式?

感谢任何帮助。

【问题讨论】:

  • 不确定你是否真的需要在 package.json 文件中包含你的配置,但如果不需要,我通常使用这个库来设置环境变量npmjs.com/package/dotenv

标签: javascript json node.js package.json


【解决方案1】:

我正在使用dotenv 包作为环境变量。

Dotenv 是加载环境变量的零依赖模块 从 .env 文件到 process.env

在你的 config.js 中

require('dotenv').config()

.env 文件

DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3

你可以像这样使用它们

const db = require('db')
db.connect({
  host: process.env.DB_HOST,
  username: process.env.DB_USER,
  password: process.env.DB_PASS
})

【讨论】:

    【解决方案2】:

    不使用基本上是 process.env 的东西,任何最新版本的 Node 都会很高兴地加载 .json 文件开箱即用,所以只需编写如下内容:

    let package = require('./package.json');
    let config = package.config || {};
    let words = config.words || [];
    

    这就是你需要做的所有事情。

    【讨论】:

    • 当然,直接加载文件会很好用。但是,正如我所说,我担心失去与当前发生的任何与环境变量的交互作为process.env hack 的一部分。你说没有吗?还是您建议我在直接读取文件的基础上重新实现该行为?
    • 为什么会有互动?作为程序员,您对使用的值负责;您的运行时环境和您的 package.json 不会相互影响。如果您需要 package.json 中的值,请加载 package.json。如果您需要 env 中的值,请使用 process.env,如果您需要更好的 env 控制,请开始使用像 dotenv 这样的真实环境包(still 不会与您的 package.json 交互 - 您的环境与 package.json 中的值无关)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 2013-12-09
    • 2012-03-15
    • 2020-12-06
    相关资源
    最近更新 更多