>  기사  >  웹 프론트엔드  >  nodejs 구성 파일 처리 방법 소개

nodejs 구성 파일 처리 방법 소개

不言
不言앞으로
2019-01-02 09:51:033959검색

이 글은 nodejs 구성 파일을 처리하는 방법에 대해 소개합니다. 이는 특정 참고 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

일반적으로 말하면: 좋은 프로젝트 구성은 다음 조건을 충족해야 합니다.

  1. 종속성 환경: 특정 실행 환경에 따라 해당 파일에서 구성을 읽습니다.

  2. 코드 분리: 구성 항목 구성 파일에서 읽거나 환경 변수에서 읽을 수 있을 뿐만 아니라 안전하고 기밀인 구성 항목이 코드에서 분리됩니다

  3. 사용하기 쉽습니다: 구성 항목은 항목을 찾고 유지하는 데 도움이 되도록 계층적으로 구성해야 합니다. 거대 구성 파일은 json 구조와 같이 정리하고 얻기 쉬워야 합니다json结构

在多人开发 nodejs 项目的时候,没有规划好配置方案,配置文件的问题就很容易暴露出来。

痛点

在开发 nodejs 的工程中,遇到过三个痛点

  1. 部署环境不同: 开发、测试、生产环境的不同,导致配置的不同

  2. 开发环境不同: 开发者的开发环境配置不同,会存在同一个配置文件配置项不同,同一文件不同内容提交,容易引起 git 冲突,影响 git 提交更新

  3. 安全地配置: 一些配置不应该明文保存在项目代码里面,比如数据库密码

解决方案

部署环境不同

对于部署环境不同,相对容易解决,建立相应环境的配置文件,比如:

  1. 开发环境配置:developmentConfig.js

  2. 测试环境配置:testConfig.js

  3. 生产环境配置:productionConfig.js

再建一个config.js配置文件作为入口获取配置,如下:

module.exports = require(`./${process.env.NODE_ENV}Config.js`)

引用配置的时候,只要引用 config.js 即可。
运行命令如下:

NODE_ENV=development node index.js

开发环境不同

对于开发环境不同,导致每个人的developmentConfig.js不同,这个不能要求别人的配置和你的一样,这样项目就太硬了。
我们可以把developmentConfig.js添加到.gitignore,从而从项目分离出来,再在readme.md说明如何配置developmentConfig.js
最好是建立一个developmentConfig.example.js,并在文档说明复制成developmentConfig.js后修改配置项符合自己的开发配置。

安全地配置

对于项目一些安全性要求高的配置项,我们应该从配置文件脱离出来,只能在当前的运行进程可以获取, 配置文件的配置项再读取进程的配置项值,比如数据库密码, 一般做法如下:
productionConfig.js

module.exports = {
    database: {
        user: process.env.user || 'root',
        password: process.env.password || 'yfwzx2019'
    }
}

而更隐秘的办法是,你根本不知道我用环境变量覆盖了配置项值,比如:

productionConfig.js

module.exports = {
    database: {
        user: 'root',
        password: 'yfwzx2019'
    }
}

一般人拿到了这个配置,就会以为数据库的账号密码就是rootyfwzx2019,其实最后会被环境变量的值覆盖,运行如下:

node index.js --database_user=combine --database_password=tencent2019

当然,是要做了一些处理才可以这样配置。

实操

方案有了,我们先来介绍以下 nodejs 的配置模块 rc模块

rc 模块

使用rc模块需要定义一个appname,选择rc模块是因为它会尽可能多的从appname命名相关的地方读取配置。
使用也很简单,先实例一个 rc 配置:

var conf = require('rc')(appname, defaultConfigObject)

然后它会从下面列表合并配置,优先级按顺序合并:

  1. 命令行参数:--user=root 或者对象形式赋值 --database.user=root

  2. 环境变量: 环境变量前缀为${appname}_的变量 appname_user=root 对象形式 appname_database__user=root

  3. 指定文件: node index.js --config file

  4. 默认配置文件: 从 ./ ../ ../../ ../../../等目录查找.${appname}rc文件

  5. $HOME/.${appname}rc

  6. $HOME/.${appname}/config

  7. $HOME/.config/${appname}

  8. $HOME/.config/${appname}/config

  9. /etc/${appname}rc

  10. /etc/${appname}/config

여러 사람이 nodejs 프로젝트를 개발하고 구성 계획을 계획하지 않으면 구성 파일에 문제가 발생하기 쉽습니다. 노출됨.

고충점

nodejs 개발 프로젝트에서 세 가지 고충을 만났습니다🎜🎜🎜🎜🎜다양한 배포 환경🎜: 개발, 테스트, 프로덕션 환경의 차이로 인해 구성도 달라집니다🎜🎜🎜🎜 🎜다른 개발 환경🎜: 개발자의 개발 환경 구성이 다른 경우 동일한 구성 파일에 대해 다른 구성 항목이 있습니다. 동일한 파일의 다른 내용을 제출하면 쉽게 git 충돌이 발생하고 git 제출 업데이트에 영향을 미칠 수 있습니다🎜🎜🎜🎜🎜보안 구성🎜: 데이터베이스 비밀번호🎜🎜🎜

솔루션

다른 배포 환경

🎜다른 배포 환경의 경우 일부 구성은 프로젝트 코드에 일반 텍스트로 저장되어서는 안 됩니다. 해당 환경 파일의 구성을 상대적으로 해결하고 설정하기가 쉽습니다. 🎜🎜🎜🎜다른 config.js를 만듭니다. 구성 파일은 다음과 같이 구성을 가져오는 입구 역할을 합니다. 🎜
var conf = require('rc')('development', {
  port: 3000,
})
console.log(JSON.stringify(conf))

// 1、直接运行
// node index.js
// { port: 3000, _: [] }

// 2、加上命令行参数
// node index.js --port=4000 --database.user=root
// { port: 4000, _: [], database: { user: 'root' } }

// 3、加上环境变量
// development_port=5000 development_database__password=yfwzx2019 node index.js 
// {"port":"5000","database":{"password":"yfwzx2019"},"_":[]}

// 4、指定配置文件:根目录建一个配置文件 config.json, 内容如下
// {
//   "port": "6000"
// }
// node index.js --config=config.json
// {"port":"6000","_":[],"config":"config.json","configs":["config.json"]}

// 5、默认读取 ${appname}rc 文件:根目录见一个配置文件 .developmentrc 内容如下:
// {
//   "port": 7000  
// }
// node index.js
// {"port":7000,"_":[],"configs":[".developmentrc"],"config":".developmentrc"}

// 6、 5 和4 一起运行
// node index.js --config=config.json
// {"port":"6000","_":[],"config":"config.json","configs":[".developmentrc","config.json"]}
🎜구성을 참조할 때 config.js를 인용하세요. >. 🎜다음 명령을 실행하세요: 🎜
NODE_ENV=development node index.js

개발 환경이 다릅니다

🎜개발 환경이 다르기 때문에 모두의 developmentConfig.js와는 달리 다른 사람의 구성이 귀하와 동일하도록 요구할 수 없습니다. 그렇지 않으면 프로젝트가 너무 어려워질 것입니다. 🎜developmentConfig.js.gitignore에 추가하여 프로젝트와 분리한 다음 readme.md에서 를 구성하는 방법을 설명할 수 있습니다. > developmentConfig.js. 🎜developmentConfig.example.js를 생성하고, 문서 지침을 developmentConfig.js에 복사한 후 자신의 개발 구성에 맞게 구성 항목을 수정하는 것이 가장 좋습니다. 🎜

안전하게 구성

🎜프로젝트에서 보안 요구 사항이 높은 일부 구성 항목은 구성 파일에서 분리해야 합니다. 구성 항목은 현재 실행 중인 프로세스에서만 얻을 수 있습니다. 그런 다음 데이터베이스 비밀번호와 같은 구성 항목 값을 프로세스로 읽어 들입니다. 일반적인 방법은 다음과 같습니다. 🎜productionConfig.js🎜
├── config
│   ├── .developmentrc.example
│   ├── .productionrc
│   ├── .testrc
│   └── index.js
🎜더 비밀스러운 방법은 이를 알지도 못한다는 것입니다. 환경 변수를 사용하여 다음과 같은 구성 항목 값을 덮어씁니다. 🎜🎜productionConfig.js🎜
let rc = require('rc')

// 因为 rc 是从 process.cwd() 向上查找 .appnamerc 文件的,我们在根目录 config 文件夹里面的是找不到的,要改变工作路径到当前,再改回去
var originCwd = process.cwd()
process.chdir(__dirname)
var conf = rc(process.env.NODE_ENV || 'production', {
  // 默认的共同配置
  origin: 'default',
  baseUrl: 'http://google.com/api',
  enableProxy: true,
  port: 3000,
  database: {
    user: 'root',
    password: 'yfwzx2019'
  }
})

process.chdir(originCwd)

module.exports = conf
🎜대부분의 사람들이 이 구성을 받으면 데이터베이스 계정 비밀번호가 root, <code>yfwzx2019이지만 결국에는 환경 변수 값으로 덮어쓰게 됩니다. 다음과 같이 실행하세요: 🎜
node index.js --database_user=combine - -database_password=tencent2019
🎜물론, 약간의 처리가 필요합니다. 🎜

실습

🎜이제 계획이 생겼으니 먼저 다음 nodejs 구성 모듈 rc 모듈을 소개하겠습니다.🎜

rc 모듈

🎜rc를 사용하려면 모듈의 경우 하나의 appname을 정의해야 합니다. rc 모듈을 선택하세요. appname 이름 지정과 관련된 위치에서 가능한 많은 구성을 읽을 수 있기 때문입니다. . 🎜사용하기도 매우 간단합니다. 먼저 rc 구성을 인스턴스화합니다. 🎜
var conf = require('rc')(appname, defaultConfigObject)
🎜그런 다음 아래 목록의 구성을 사용하면 우선순위가 순서대로 병합됩니다. 🎜🎜🎜🎜명령줄 매개변수: --user=root 또는 개체 양식 할당 --database.user=root🎜🎜🎜🎜환경 변수: 환경 변수 접두사는 ​​${appname}_ =root 개체 형식의 appname_user 변수 appname_database__user=root🎜🎜🎜🎜지정 파일: node index.js --config file🎜🎜🎜🎜기본 구성 파일: ./ ../ . ./../ ../.. /../ 및 기타 디렉터리에서 .${appname}rc 파일🎜🎜🎜🎜$HOME/.$을 검색합니다. {appname}rc🎜🎜🎜🎜$HOME/.${appname}/config🎜🎜🎜🎜$HOME/.config/${appname} 🎜🎜🎜🎜$HOME/.config/ ${appname}/config🎜🎜🎜🎜/etc/${appname}rc🎜🎜🎜🎜/ etc/${appname}/config🎜 🎜🎜🎜더 직관적으로 만들기 위해 데모를 만들었습니다🎜
var conf = require('rc')('development', {
  port: 3000,
})
console.log(JSON.stringify(conf))

// 1、直接运行
// node index.js
// { port: 3000, _: [] }

// 2、加上命令行参数
// node index.js --port=4000 --database.user=root
// { port: 4000, _: [], database: { user: 'root' } }

// 3、加上环境变量
// development_port=5000 development_database__password=yfwzx2019 node index.js 
// {"port":"5000","database":{"password":"yfwzx2019"},"_":[]}

// 4、指定配置文件:根目录建一个配置文件 config.json, 内容如下
// {
//   "port": "6000"
// }
// node index.js --config=config.json
// {"port":"6000","_":[],"config":"config.json","configs":["config.json"]}

// 5、默认读取 ${appname}rc 文件:根目录见一个配置文件 .developmentrc 内容如下:
// {
//   "port": 7000  
// }
// node index.js
// {"port":7000,"_":[],"configs":[".developmentrc"],"config":".developmentrc"}

// 6、 5 和4 一起运行
// node index.js --config=config.json
// {"port":"6000","_":[],"config":"config.json","configs":[".developmentrc","config.json"]}

具体操作

看了 rc 模块,可以满足我们的需求,我们可以配置公共的配置项,也可以隐秘的覆盖我们的配置项。

  1. 创建配置文件目录,添加配置文件

├── config
│   ├── .developmentrc.example
│   ├── .productionrc
│   ├── .testrc
│   └── index.js

其中 .developmentrc.example 是开发环境的例子,然后开发人员参考建 .developmentrc 文件, index.js 是配置入口文件,内容如下:

let rc = require('rc')

// 因为 rc 是从 process.cwd() 向上查找 .appnamerc 文件的,我们在根目录 config 文件夹里面的是找不到的,要改变工作路径到当前,再改回去
var originCwd = process.cwd()
process.chdir(__dirname)
var conf = rc(process.env.NODE_ENV || 'production', {
  // 默认的共同配置
  origin: 'default',
  baseUrl: 'http://google.com/api',
  enableProxy: true,
  port: 3000,
  database: {
    user: 'root',
    password: 'yfwzx2019'
  }
})

process.chdir(originCwd)

module.exports = conf
  1. 关于部署环境的不同,获取配置通过设置环境变量NODE_ENV来适配

  2. 关于开发环境的不同,在.gitignore添加config/.developmentrc,项目代码去掉开发环境配置.developmentrc,开发人员根据.developmentrc.example建直接的开发配置.developmentrc

  3. 关于安全地配置,通过添加环境变量覆盖默认值,可以安全隐秘地覆盖配置项,比如:

NODE_ENV=production node index.js --database.password=tencent2019


위 내용은 nodejs 구성 파일 처리 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제