1 引言

本期精读的文章是:如何在 nodejs 使用环境变量。

介绍了开发与生产环境如何管理环境变量。

这里环境变量指的是数据库密码等重要数据,而不是指普通变量传参。

2 概述

环境变量历史悠久,在运行第一行 JAVA 代码之前,你就得将环境变量设置好。

可问题是,系统变量并不易用,比如结尾是否要使用分号,JAVA_HOME 与 PATH 在哪些程序中功能相同?而且与操作系统绑定,在操作系统级别设置的变量,给 JAVA 级别的程序用还好,但用来存数据库密码就不合适了。

在 Node 中,我们怎样使用环境变量呢?作者给出了如下的建议:

通过命令行传递

PORT=65534 node bin/www

这是最基本、最常用的方式,可是当变量数量过多,不免觉得很崩溃:

PORT=65534 DB_CONN="mongodb://react-cosmos-db:swQOhAsVjfHx3Q9VXh29T9U8xQNVGQ78lEQaL6yMNq3rOSA1WhUXHTOcmDf38Q8rg14NHtQLcUuMA==@react-cosmos-db.documents.azure.com:19373/?ssl=true&replicaSet=globaldb" SECRET_KEY=b6264fca-8adf-457f-a94f-5a4b0d1ca2b9  node bin/www

作者提到,这种代码没有拓展性。作者认为,对工程师来说,可拓展性甚至比能正确运行更为重要。

使用 .env 文件

很显然,命令行写不下了就写到文件里:

PORT=65534
DB_CONN="mongodb://react-cosmos-db:swQOhAsVjfHx3Q9VXh29T9U8xQNVGQ78lEQaL6yMNq3rOSA1WhUXHTOcmDf38Q8rg14NHtQLcUuMA==@react-cosmos-db.documents.azure.com:10255/?ssl=true&replicaSet=globaldb"
SECRET_KEY="b6264fca-8adf-457f-a94f-5a4b0d1ca2b9"

通过 dotenv 这个 npm 包可以读取 .env 文件的配置到 Nodejs 程序中。

npm install dotenv --save

安装后,直接调用它解析,就可以从环境变量中拿到 .env 文件的配置信息了:

require("dotenv").config();
var MongoClient = require("mongodb").MongoClient;// Reference .env vars off of the process.env object
MongoClient.connect(process.env.DB_CONN,function(err, db) {if (!err) {console.log("We are connected");}}
);

这有个问题,不要将配置文件发送到 Git 仓库,可能会泄漏隐私数据。然而 VSCode 帮你解决了这个问题(什么,你不用 VSCode?)

VSCode 启动配置

VSCode 可以配置 Node 启动配置,在这里可以设置环境变量:

为了和 .env 文件打通,我们可以在配置里设置 envFile 属性:

{"envFile": "${workspaceFolder}/.env"
}

程序中依然使用 dotenv 读取环境变量。这么做将配置保留在 VSCode 中,而不是代码中,不用再担心不小心上传了配置文件啦!

使用 Npm Scripts

作者推荐了一个良好的习惯:使用 npm start 运行项目,而不是暴露出 Node 命令。那么首先在 VSCode launch.json 中配置 Npm 模式:

记住,需要给 Node 脚本添加 --inspect 参数,才能触发 VSCode debugger 的钩子:

这样一来,通过 npm start 就可以启动 Node,并读取配置在 VSCode 的环境变量。

生产环境的环境变量

上面介绍了本地开发如何使用环境变量,但在生产环境,环境变量必须得换个方式管理。

不知道作者与微软是什么关系,这块推荐了微软的 Azure 管理环境变量。

主要思路是通过一个不赚差价的中间商提供环境变量管理服务。通过 Azure CLI 启动你的 Node 项目,就可以从云服务平台拿到环境变量信息。

3 精读

环境变量管理是非常重要的问题,以前还看到将公司数据库密码提交到 Github 的例子,反面教材非常多。

本文介绍了许多本地开发使用环境变量的方式,笔者补充一下生产环境使用环境变量的经验。

私有部署

如果你在一个高自动化运维水平的公司,这个问题已经被私有 Git + 私有云服务器天然解决了。

是的,部署私有 Git,把数据库密码提交到 Git 仓库才是最完美的方案!

持久化配置服务

通过自建,或者开源的 Azure 持久化配置服务存储环境变量,在服务器利用 SDK 获取它。

一般云服务商都会打包这项服务,因为只有服务器和持久化配置服务都由一个供应商提供,供应商才能将持久化配置与服务器权限形成关联,让第三方服务器即便拿到 Token 也无法访问配置。

加密服务

如果安全级别特别高,内部 Git 都不允许提交,又要防止第三方(比如某宽带运营商)拦截到信息,就要使用加密服务了。

流程一般是:

  1. 在加密平台注册,拿到密钥。
  2. 在加密平台设置环境变量,加密平台会对内容进行加密。
  3. 利用 Node SDK 获取到加密平台输出的密文。
  4. 利用 SDK 和密钥解密成明文。

4 总结

对待在基础设施完备公司的同学,可能不需要关心环境变量安全性问题。对于自己搭建博客,或者使用第三方服务器的同学,这篇文章告诉我们三个注意点:

  1. 不要将重要环境变量提交到公开的 Git 仓库。
  2. 本地通过 VSCode 调试环境变量既方便又安全。
  3. 生产环境通过云服务商提供的环境变量配置服务拿到环境变量。

5 更多讨论

讨论地址是:精读《如何在 nodejs 使用环境变量》 · Issue #89 · dt-fe/weekly

如果你想参与讨论,请点击这里,每周都有新的主题,周末或周一发布。

精读《如何在 nodejs 使用环境变量》相关推荐

  1. 【韩松】Deep Gradient Comression_一只神秘的大金毛_新浪博客

    <Deep Gradient Compression> 作者韩松,清华电子系本科,Stanford PhD,深鉴科技联合创始人.主要的研究方向是,神经网络模型压缩以及硬件架构加速. 论文链 ...

  2. 【韩松】Deep Gradient Comression

    <Deep Gradient Compression> 作者韩松,清华电子系本科,Stanford PhD,深鉴科技联合创始人.主要的研究方向是,神经网络模型压缩以及硬件架构加速. 论文链 ...

  3. [文献阅读] Sparsity in Deep Learning: Pruning and growth for efficient inference and training in NN

    文章目录 1. 前言 2. Overview of Sparsity in Deep Learning 2.1 Generalization 2.2 performance and model sto ...

  4. 【翻译】Batch Normalization: Accelerating Deep Network Trainingby Reducing Internal Covariate Shift

    Batch Normalization: Accelerating Deep Network Trainingby Reducing Internal Covariate Shift Sergey I ...

  5. 模型加速--CLIP-Q: Deep Network Compression Learning by In-Parallel Pruning-Quantization

    CLIP-Q: Deep Network Compression Learning by In-Parallel Pruning-Quantization CVPR2018 http://www.sf ...

  6. 论文笔记30 -- (视频压缩)【CVPR2021】FVC: A New Framework towards Deep Video Compression in Feature Space

    <FVC: A New Framework towards Deep Video Compression in Feature Space> CVPR 2021 的一篇Oral 提出了特征 ...

  7. 端到端图像压缩《Asymmetric Gained Deep Image Compression With Continuous Rate Adaptation》

    Asymmetric Gained Deep Image Compression With Continuous Rate Adaptation 一 简介 二 内容 2.1 目前方法的缺陷 2.2 整 ...

  8. 深度学习视频压缩1—DVC: An End-to-end Deep Video Compression Framework

    本文是第一篇端到端使用神经网络来进行视频压缩的论文, github地址:GitHub - GuoLusjtu/DVC: DVC: An End-to-end Deep Video Compressio ...

  9. 【论文阅读】Deep Compositional Captioning: Describing Novel Object Categories without Paired Training Data

    [论文阅读]Deep Compositional Captioning: Describing Novel Object Categories without Paired Training Data ...

  10. CVPR 2018 TRACA:《Context-aware Deep Feature Compression for High-speed Visual Tracking》论文笔记

    理解出错之处望不吝指正. 本文的模型叫做TRACA.模型中使用多个expert auto-encoder,在预训练阶段,每个expert auto-encoder针对一个特定类进行训练:在tracki ...

最新文章

  1. 利用java虚拟机的工具jmap分析java内存情况
  2. java网络编程udp_java网络编程 UDP网络编程问题
  3. 树形dp ---- gym101667 A(贪心 + 树形dp + 两个dp方程组维护)
  4. 单机结构 集群结构 分布式结构
  5. From 《visual C++ 6.0开发工具与调试》
  6. 成为项目经理需要具备什么条件?
  7. DT时代释放金融数据价值,驱动金融商业裂变
  8. Jdk并发线程处理CountDownLatch、CyclicBarrier、Semaphore
  9. Qt5学习笔记之串口助手一:基本界面设计
  10. oracle滚动统计,sql – 按月滚动或运行Oracle总计
  11. element ui的时间选择器
  12. 黑苹果使用itlwm网卡驱动提示itlwm未运行的问题
  13. Firewalld 允许指定IP访问端口
  14. android 获取录音时长_Android、iOS录音时音量大小计算
  15. VS社区版离线试用到期解决办法
  16. hbase版本对应的hadoop版本
  17. DHT11温湿度传感器原理剖析
  18. 数理统计复习笔记七——列联表的独立性检验
  19. 在树莓派上做一个远程控制的小车(基于Python)
  20. 学前教育试题库及答案_《学前教育科学研究》练习题库及答案汇总

热门文章

  1. 关于缓存使用中的一些看法
  2. Fisher-Yates 乱序算法
  3. Codeforces Round #275 (Div. 2)
  4. Android开发学习笔记(11):NDK与Cygwin配置手顺
  5. linux 每日学一点《如何用iptables实现NAT》
  6. 记录:txt文本分割命令,用于notepad++无法打开情况下分割文件
  7. ati hd4570 linux amd 64 安装命令,ATI 显卡的驱动在Linux下的安装方法
  8. DOCKER基础技术:LINUX NAMESPACE(上)
  9. 深入解读Linux进程调度系列(5)——调度的入口
  10. 使用FreeSWITCH SIP落地的配置总结