Eu tenho trabalhado em alguns aplicativos de Nó e tenho procurado um bom padrão de armazenamento de configurações relacionadas à implantação. No mundo do Django (de onde eu venho), a prática comum seria ter um settings.py
arquivo contendo as configurações padrão (fuso horário, etc) e, em seguida, um local_settings.py
para configurações específicas de implantação, ie. qual banco de dados conversar, qual soquete do memcache, endereço de email para os administradores e assim por diante.
Eu tenho procurado padrões semelhantes para Node. Apenas um arquivo de configuração seria bom, portanto, não precisa ser bloqueado com todo o resto app.js
, mas acho importante ter uma maneira de ter uma configuração específica do servidor em um arquivo que não esteja no controle de origem. O mesmo aplicativo pode ser implantado em diferentes servidores com configurações totalmente diferentes, e ter que lidar com conflitos de mesclagem e tudo o que não é minha ideia de diversão.
Então, existe algum tipo de estrutura / ferramenta para isso, ou todos simplesmente cortam algo juntos?
Respostas:
Eu uso um
package.json
para meus pacotes e umconfig.js
para minha configuração, que se parece com:Eu carrego a configuração do meu projeto:
e então posso acessar minhas coisas de
config.db_host
,config.db_port
etc ... Isso me permite usar parâmetros codificados ou parâmetros armazenados em variáveis ambientais, se não desejar armazenar senhas no controle de origem.Também gero
package.json
e insiro uma seção de dependências:Quando clono o projeto na minha máquina local, corro
npm install
para instalar os pacotes. Mais informações sobre isso aqui .O projeto é armazenado no GitHub, com controles remotos adicionados ao meu servidor de produção.
fonte
Você pode exigir arquivos JSON a partir do Nó v0.5.x ( referenciando esta resposta )
config.json:
app.js:
fonte
Muito mais tarde, encontrei um módulo Node.js muito bom para gerenciar a configuração: nconf .
Um exemplo simples:
Ele também suporta o armazenamento de configurações no Redis , a gravação de arquivos de configuração e possui uma API bastante sólida, além de ser apoiado por uma das lojas mais respeitadas do Node.js. , o Nodejitsu , como parte da iniciativa da estrutura Flatiron. razoavelmente à prova de futuro.
Confira o nconf no Github .
fonte
Minha solução é bastante simples:
Carregue a configuração do ambiente em ./config/index.js
Defina alguns padrões em ./config/config.global.js
Substitua os padrões em ./config/config.test.js
Utilizando-o em ./models/user.js:
Executando seu aplicativo no ambiente de teste:
fonte
NODE_ENV
padrão é 'desenvolvimento'. Você deve procurar por 'produção'.Você também pode procurar o dotenv, que segue os princípios de um aplicativo de doze fatores .
Eu costumava usar o node-config, mas criei o dotenv por esse motivo. Foi completamente inspirado pela biblioteca dotenv do ruby.
O uso é bastante fácil:
Então você apenas cria um arquivo .env e coloca suas configurações como:
Isso é dotenv para nodejs.
fonte
foreman run node xx.js
isso também lerá automaticamente o seu arquivo .env..env
arquivo no seu controle de versão ou processo de implantação.Vocês estão usando o npm para iniciar seus scripts (env etc)?
Se você usar
.env
arquivos, poderá incluí-los no seupackage.json
e usar o npm para fonte / iniciá-los.Exemplo:
em seguida, execute os scripts npm:
É descrito aqui https://gist.github.com/ericelliott/4152984 Todo o crédito a Eric Elliot
fonte
source : not found
source
(ou simplesmente.
) é um comando interno nos shells do Unix (Bash, etc.) para ler e executar comandos do arquivo fornecido, no shell atual . Ou seja, os comandos não são executados em um sub-shell. O efeito disso neste exemplo é que as variáveis de ambiente definidas emprod.env
são adicionadas ao shell atual e, portanto, passadas para qualquer processo filho gerado por esse shell. Você parece estar usando o Windows CMD. Veja esta pergunta para mais detalhes.dev.env
eprod.env
, mas ter um único.env
arquivo por implantação.Você também pode procurar a node-config, que carrega o arquivo de configuração, dependendo da variável $ HOST e $ NODE_ENV (um pouco como a RoR): documentação .
Isso pode ser bastante útil para diferentes configurações de implantação (
development
,test
ouproduction
).fonte
Basta fazer um simples
settings.js
comexports
:Em seu script, faça um
require
:Todas as suas configurações agora estarão disponíveis via
settings
variável:fonte
Vou jogar meu chapéu no ringue aqui, porque nenhuma dessas respostas aborda todos os componentes críticos que praticamente qualquer sistema precisa. Considerações:
Aqui está como eu faço minha configuração:
config.default.private.js
- No controle de versão, essas são opções de configuração padrão que só podem ser vistas pelo seu back-end.config.default.public.js
- No controle de versão, essas são opções de configuração padrão que podem ser vistas pelo back - end e front - endconfig.dev.private.js
- Se você precisar de diferentes padrões privados para dev.config.dev.public.js
- Se você precisar de diferentes padrões públicos para dev.config.private.js
- Não no controle de versão, são opções específicas do ambiente que substituemconfig.default.private.js
config.public.js
- Não no controle de versão, são opções específicas do ambiente que substituemconfig.default.public.js
keys/
- Uma pasta onde cada arquivo armazena um segredo diferente de algum tipo. Isso também não está sob controle de versão (as chaves nunca devem estar sob controle de versão).Eu uso arquivos javascript simples para configuração, para ter todo o poder do idioma javascript (incluindo comentários e a capacidade de fazer coisas como carregar o arquivo de configuração padrão no arquivo específico do ambiente para que possam ser substituídos). Se você quiser usar variáveis de ambiente, poderá carregá-las dentro desses arquivos de configuração (embora eu recomendo o uso de env vars pelo mesmo motivo, não recomendo o uso de arquivos json - você não tem o poder de uma linguagem de programação para construir sua configuração).
A razão pela qual cada chave está em um arquivo separado é para uso do instalador. Isso permite que você tenha um instalador que cria chaves na máquina e as armazena na pasta de chaves. Sem isso, seu instalador pode falhar quando você carrega o arquivo de configuração que não pode acessar suas chaves. Dessa forma, você pode percorrer o diretório e carregar todos os arquivos de chave que estão nessa pasta sem ter que se preocupar com o que existe e o que não existe em qualquer versão do seu código.
Como você provavelmente tem chaves carregadas em sua configuração privada, você definitivamente não deseja carregar sua configuração privada em nenhum código de front-end. Embora seja provavelmente estritamente mais ideal separar completamente sua base de código de front-end e back-end, muitas vezes o PITA é uma barreira grande o suficiente para impedir que as pessoas o façam, portanto, configuração privada versus pública. Mas há duas coisas que faço para impedir que a configuração privada seja carregada no front-end:
Uma última coisa: sua configuração deve ser carregada no navegador por meio de um arquivo completamente separado do que qualquer outro código de front-end. Se você agrupar seu código de front-end, a configuração pública deverá ser construída como um pacote completamente separado. Caso contrário, sua configuração não será mais configurada - é apenas parte do seu código. O Config precisa ser diferente em máquinas diferentes.
fonte
Convict é outra opção que adiciona um esquema para validação. Como o nconf, ele suporta o carregamento de configurações de qualquer combinação de variáveis de ambiente, argumentos, arquivos e objetos json.
Exemplo do README:
Artigo de introdução: Domesticando configurações com node-convict
fonte
Você pode usar o Konfig para arquivos de configuração específicos do ambiente. Carrega arquivos de configuração json ou yaml automaticamente, possui valor padrão e recursos de configuração dinâmica.
Um exemplo do repositório Konfig:
Em desenvolvimento:
Na produção, suponha que começamos a aplicação com
$ NODE_ENV=production PORT=4567 node app.js
Mais detalhes: https://github.com/vngrs/konfig
fonte
Vou criar uma pasta como config, nomeando um arquivo
config.js
e, mais tarde, usarei esse arquivo sempre que necessário, conforme abaixoExemplo de config.js
Então, se eu quiser usar esse arquivo de configuração em algum lugar
Primeiro importarei como abaixo
var config = require('./config');
e eu posso acessar os valores como abaixo
fonte
Basta usar o
npm
móduloconfig
(mais de 300000 downloads)https://www.npmjs.com/package/config
O Node-config organiza configurações hierárquicas para implantações de aplicativos.
Permite definir um conjunto de parâmetros padrão e estendê-los para diferentes ambientes de implantação (desenvolvimento, qa, preparo, produção, etc.).
fonte
É melhor separar as configurações de 'desenvolvimento' e 'produção' .
Eu uso da seguinte maneira: Aqui está o meu arquivo config / index.js :
Para exigir a configuração, use o seguinte:
Do que você pode usar seu objeto de configuração:
fonte
module.exports = config;
no final doconfig/index.js
arquivoEstou um pouco atrasado no jogo, mas não consegui encontrar o que precisava aqui - ou em qualquer outro lugar -, então escrevi algo.
Meus requisitos para um mecanismo de configuração são os seguintes:
settings-overrides.js
- que parece o mesmo, mas permite substituições de configuração emsettings.js
. A idéia aqui é modificar a configuração facilmente, sem alterar o código. Acho útil para saas.Mesmo que eu me importe menos com ambientes de suporte - o explicará como adicioná-lo facilmente à minha solução
Explicação
undefined
significa que essa propriedade é necessárianull
significa que é opcionalmeConf
- atualmente o código é direcionado para um arquivo emapp
.meConf
são os arquivos de substituição direcionados aconf/dev
- que são ignorados pelos meus vcs.publicConfiguration
- ficará visível no front-end e no back-end.privateConfiguration
- ficará visível apenas no back-end.sendPublicConfiguration
- uma rota que exporá a configuração pública e a atribuirá a uma variável global. Por exemplo, o código abaixo irá expor a configuração pública como variável global myConf no front-end. Por padrão, ele usará o nome da variável globalconf
.app.get ("/ back-end / conf", require ("conf"). sendPublicConfiguration);
Lógica de substituições
Adicionando suporte ao ambiente
Mesmo que eu não ache um "suporte ao ambiente" útil, talvez alguém o encontre.
Para adicionar suporte ao ambiente, você precisa alterar a instrução de requisição meConf para algo assim (pseudocódigo)
if (environment == "production") {meConf = require ("../conf / dev / meConf"). production; }
if (environment == "development") {meConf = require ("../conf / dev / meConf"). development; }
Da mesma forma, você pode ter um arquivo por ambiente
e importe o caminho certo. O restante da lógica permanece o mesmo.
fonte
undefined
realmente significa 'obrigatório' enull
significa 'opcional'. então a lixeira amarela é para plásticos e a azul é para papel de rascunho? tudo bem, mas tive que ler o manual antes de jogar a areia.um exemplo alt que acabei de usar porque queria mais flexibilidade do que um arquivo .json típico, mas não queria que ele fosse abstraído para uma biblioteca que exigiria uma dependência é algo como isto. Basicamente, exportar uma função chamada imediatamente que retornou um objeto com os valores que eu queria definir. Dá muita flexibilidade.
Há uma explicação muito melhor com exemplo completo aqui. Usando arquivos de configuração no Node.js
fonte
Eu sei que este é um post muito antigo. Mas eu quero compartilhar meu módulo para configurar variáveis de ambiente, acho que é uma solução muito flexível. Aqui está o módulo json-configurator
Então você pode usar
process.env.NODE_ENV
para obter todas as variáveis para o seu ambiente.fonte
Além do módulo nconf mencionado nesta resposta e do node-config mencionado nesta resposta , também existem o node-iniparser e o IniReader , que parecem ser analisadores de arquivo de configuração .ini mais simples.
fonte
iniparser
enfatizam orgulhosamente o fato de saberem analisar seções na configuração ... em 2013 ... se você precisar de um aninhamento mais profundo, você diz[foo/bar]
?[foo\bar]
?bar.baz=42
?bar/baz=42
?bar\baz=42
?bar:baz=42
? como você diz42
é um número? pode ser um texto com todos os dígitos!Acabei de lançar um pequeno módulo para carregar qualquer tipo de arquivo de configuração. É bem direto, você pode conferir em https://github.com/flesler/config-node
fonte
Você pode usar o pconf: https://www.npmjs.com/package/pconf
Exemplo:
fonte
Aqui está uma abordagem elegante, inspirada neste artigo . Ele não requer nenhum pacote adicional, exceto o onipresente pacote lodash . Além disso, permite gerenciar padrões aninhados com substituições específicas do ambiente.
Primeiro, crie uma pasta de configuração no caminho raiz do pacote que se parece com isso
aqui está o arquivo index.js
Agora vamos supor que temos um defaults.json assim
e development.json assim
se você fizer
config = require('./config')
aqui é o que você receberáObserve que você obtém todos os valores padrão, exceto aqueles definidos em arquivos específicos do ambiente. Então você pode gerenciar uma hierarquia de configuração. O uso
defaultsDeep
garante que você possa ter padrões aninhados.fonte
Para quem está visitando esse tópico antigo, aqui está um pacote que considero bom.
https://www.npmjs.org/package/config
fonte
Tentei algumas das soluções sugeridas aqui, mas não fiquei satisfeito com elas, então criei meu próprio módulo. Ele é chamado
mikro-config
e a principal diferença é que ele respeita as convenções sobre a configuração, para que você possa apenas precisar do módulo e começar a usá-lo.Você armazena sua configuração em arquivos js simples ou json da
/config
pasta. Primeiro, ele carrega odefault.js
arquivo, depois todos os outros arquivos do/config
diretório e, em seguida, carrega a configuração específica do ambiente com base na$NODE_ENV
variável.Também permite substituir essa configuração para desenvolvimento local
local.js
ou específico do ambiente/config/env/$NODE_ENV.local.js
.Você pode dar uma olhada aqui:
https://www.npmjs.com/package/mikro-config
https://github.com/B4nan/mikro-config
fonte
Por muito tempo, eu costumava usar a abordagem mencionada na solução aqui. No entanto, existe uma preocupação com a segurança dos segredos em texto não criptografado. Você pode usar outro pacote em cima
config
para que os bits de segurança sejam resolvidos.Verifique isso: https://www.attosol.com/secure-application-secrets-using-masterkey-in-azure-key-vault/
fonte