尽管所有测试都表明一切正常,但在运行 node.js 应用程序时收到此警告。
我已在我的应用程序中包含以下代码以进行故障查找:
console.log('NODE_ENV: ' + config.util.getEnv('NODE_ENV'));
console.log('NODE_CONFIG_DIR: ' + config.util.getEnv('NODE_CONFIG_DIR'));
终端的输出是:
NODE_ENV: test
NODE_CONFIG_DIR: C:\Users\[username]\OneDrive - [Company Name]\Documents\projects\[project name]\server\config
终端输出
在该文件夹内(通过将 URI 复制并粘贴到资源管理器中进行验证)有两个文件:
default.json
test.json
配置文件夹内容
这对我来说似乎是正确的,我已经检查了指南,但看不到任何东西,检查了谷歌点击量,答案似乎没有关联。任何帮助将不胜感激。
安装后node-config
和@types/config
:
yarn add config
yarn add --dev @types/config
Run Code Online (Sandbox Code Playgroud)
并按照lorenwest / node-config中的描述添加配置:
// default.ts
export default {
server: {
port: 4000,
},
logLevel: 'error',
};
Run Code Online (Sandbox Code Playgroud)
当我尝试在我的应用中使用时:
import config from 'config';
console.log(config.server);
Run Code Online (Sandbox Code Playgroud)
我收到错误消息:
src/app.ts(19,53): error TS2339: Property 'server' does not exist on type 'IConfig'.
Run Code Online (Sandbox Code Playgroud) 首先,这是我第一次使用 Sequelize,所以请耐心等待。
我想使用https://github.com/sequelize/cli 和https://github.com/lorenwest/node-config
我希望sequelize能够从多个源文件“组合”它的配置,就像node-config那样。
到目前为止我已经解决了
var path = require('path')
var Config = require('config');
var env =Config.util.getEnv('NODE_ENV');
module.exports = {
'config': path.resolve('config', env + '.json')
}
Run Code Online (Sandbox Code Playgroud)
{
"app": {
"name": "my api"
},
"server": {
"port": 8081
},
"development": {
"username": "username",
"password": "password",
"database": "database",
"host": "127.0.0.1",
"dialect": "mysql"
}
}
Run Code Online (Sandbox Code Playgroud)
您可以看到我必须在所有 env.json 文件中设置一个没有逻辑意义的冗余 env 键。
有没有更好的办法 ?
获取数据:
var env =Config.util.getEnv('NODE_ENV');
var configDb = Config.get(env);
Run Code Online (Sandbox Code Playgroud)
这样,文件加载顺序的所有选项都会丢失。
https://github.com/lorenwest/node-config/wiki/Configuration-Files
sequelize db:migrate --url 'mysql://root:password@mysql_host.com/database_name' …
Run Code Online (Sandbox Code Playgroud) 当 NODE_ENV 设置为“test”时,Node-config 的 custom-environment-variables.json 似乎不会覆盖 default.json 中的值。这是一个非常简单的配置:
配置/默认.json:
{
"jwtPrivateKey": "defaultkey"
}
Run Code Online (Sandbox Code Playgroud)
配置/自定义环境变量.json:
{
"jwtPrivateKey": "JWTPRIVATEKEY"
}
Run Code Online (Sandbox Code Playgroud)
配置/测试.json:
{}
Run Code Online (Sandbox Code Playgroud)
应用程序.js:
console.log('NODE_ENV': + process.env.NODE_ENV);
console.log('Env: ' + process.env.JWTPRIVATEKEY);
console.log("Config: " + config.get('jwtPrivateKey'));
Run Code Online (Sandbox Code Playgroud)
这按预期工作:我得到 NODE_ENV=undefined (因此节点配置将默认为“development”),接下来的两行都打印环境变量中设置的正确值。但是,如果我尝试使用 Jest 运行一个简单的测试并打印相同的内容:
测试/some.test.js:
test('Some Test', () => {
console.log('NODE_ENV:' + process.env.NODE_ENV);
console.log('Env: ' + process.env.JWTPRIVATEKEY);
console.log("Config: " + config.get('jwtPrivateKey'));
});
Run Code Online (Sandbox Code Playgroud)
我得到 NODE_ENV=test, Env=环境变量中设置的正确值...但 Config=defaultKey。
换句话说:虽然它显示环境变量设置为正确的值,但node-config似乎没有通过custom-environment-variables.json将其拉入。
这是一个错误吗?我已经查阅了文档,但无法找到造成这种差异的任何原因。
config
我想将环境变量加载到我的 Express 应用程序的常规中。在本地,我使用一个.env
文件,但在部署时,我会将环境变量注入到 docker 容器中。
所以,我有default.json
一些硬编码的配置值。然后我得到了custom-environment-variables.json
这样的文件:
"app": {
"nodeEnv": "NODE_ENV",
"port": "PORT",
"hostname": "HOSTNAME"
}
"mongoDb": {
"connectionString": "MONGODB_CONNECTION_STRING"
},
"redis": {
"connectionString": "REDIS_CONNECTION_STRING"
},
"logDna": {
"key": "LOGDNA_KEY"
}
Run Code Online (Sandbox Code Playgroud)
以及.env
我项目的根目录中的一个文件。
在服务器启动文件中我有:
import * as dotenv from 'dotenv';
dotenv.config();
import * as config from 'config';
console.log(process.env);
console.log(config);
Run Code Online (Sandbox Code Playgroud)
我还尝试将它们按正常顺序排列:
import * as config from 'config';
import * as dotenv from 'dotenv';
dotenv.config();
Run Code Online (Sandbox Code Playgroud)
我尝试的另一件事是将应用程序声明与服务初始化和应用程序启动分开。就像这样app.ts
:
import * as App from 'express';
import …
Run Code Online (Sandbox Code Playgroud) 我想在测试时覆盖一些值,特别是将HTTP服务的重试次数设置为1(立即失败,不重试)。我们的项目使用node-config
。根据文档,我可以用NODE_CONFIG
env变量覆盖:
node myapp.js --NODE_CONFIG='{"Customer":{"dbConfig":{"host":"customerdb.prod"}}}'
Run Code Online (Sandbox Code Playgroud)
好吧,我宁愿在我的测试中这样做,但不是对所有测试都这样做。该代码说,您可以通过设置允许配置突变ALLOW_CONFIG_MUTATIONS
。
process.env.ALLOW_CONFIG_MUTATIONS = "true";
const importFresh = require('import-fresh');
importFresh("config");
process.env.NODE_CONFIG = JSON.stringify({httpServices:{integration:{enrich: {retryInterval: 1, retries: 1}}}});
expect(process.env.NODE_CONFIG, 'NODE_CONFIG not set').to.exist();
expect(process.env.NODE_CONFIG, 'NODE_CONFIG not set').to.match(/retryInterval/);
expect(process.env.ALLOW_CONFIG_MUTATIONS, 'ALLOW_CONFIG_MUTATIONS not set').to.equal("true");
const testConfig = require("config");
console.dir(testConfig.get("httpServices.integration.enrich"));
expect(testConfig.get("httpServices.integration.enrich.retryInterval"), 'config value not set to 1').to.equal(1);
Run Code Online (Sandbox Code Playgroud)
结果:
{ url: 'https://internal-**********',
retryInterval: 5000,
retries: 5 }
`Error: config value not set to 1: Expected 5000 to equal specified value: 1`
Run Code Online (Sandbox Code Playgroud)
我如何获得此替代才能正常工作?
(预期来自Hapi.js代码库)
我在使用打字稿时遇到了节点配置库的问题。
我的配置文件夹如下:
但是,在我运行 tsc 并尝试从它的入口点 (app.js) 启动我的应用程序后,我收到以下错误:
Error: Cannot parse config file: '..../config/development.ts': TypeError: config/development.ts: Emit skipped
从该文件夹中删除打字稿文件并仅保留 .js 文件时,它可以工作。有人知道我如何解决这个问题吗?
这是我的 tsconfig 的样子:
"target": "es6"
"module": "commonjs"
"strict": true
"esModuleInterop": true
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激,谢谢!
我基本上在我所有的项目中都使用node-config,大多数时候我都会遇到解析设置为环境变量的布尔值和数字的问题。
例如
默认.js
module.exports = {
myNumber = 10,
myBool = true
}
Run Code Online (Sandbox Code Playgroud)
自定义环境变量.js
module.exports = {
myNumber = "MY_NUMBER",
myBool = "MY_BOOL"
}
Run Code Online (Sandbox Code Playgroud)
现在,明显的问题是,如果我使用设置为环境变量的自定义值覆盖默认值,它们将是字符串值而不是数字或布尔值。所以现在,要确保我的代码中的类型是正确的。我总是必须进行类型转换,对于布尔值,请使用适当的库,例如yn。问题是我每次使用config.get()
例如+config.get("myNumber")
or时都必须进行此转换yn(config.get("myBool"))
。
有没有更好,更优雅的方法来做到这一点?
我看到的一种解决方案是将类型属性添加到环境变量中,因为它在此处使用格式完成。这将允许做这样的事情......
自定义环境变量.js
module.exports = {
myNumber = {
name: "MY_NUMBER",
type: "number"
},
myBool = {
name: "MY_BOOL",
type: "boolean"
}
}
Run Code Online (Sandbox Code Playgroud)
node-config
将处理类型转换,并且在获取它时无需一直在代码中执行此操作。当然,需要为布尔值实现适当的解析器,但那些已经存在并且可以在这里使用。
我有以下 default/config.js 文件
/* eslint-disable @typescript-eslint/no-var-requires */
require('dotenv').config({
path: require('find-config')('.env'),
});
module.exports = {
cronInterval: process.env.CRON_INTERVAL,
queueName: process.env.QUEUE_NAME || '',
isVisible: process.env.IS_VISIBLE
};
Run Code Online (Sandbox Code Playgroud)
在我的 index.ts 中,我有
import config from 'config';
import * as cron from 'node-cron';
const isVisible = config.get<boolean>('isVisible');
const queueName = config.get<string>('queueName');
const cronInterval = config.get<string>('cronInterval');
function startProcess(queueName) {
cron.schedule(cronInterval, () => {});
}
// process starts here
if (isVisible) {
startProcess(queueName);
} else {
logger.info('Wont start')
}
Run Code Online (Sandbox Code Playgroud)
在我的单元测试中,我想测试 的两种情况isVisible
,同时保持其他配置值不变。
我试过
describe.only('isVisible', () => {
beforeEach(() …
Run Code Online (Sandbox Code Playgroud) 我正在运行config@1.30.0
,我试图从环境变量获取设置使用.\config\custom-environment-variables.json
不起作用.但是,它读起来.\config\default.json
就好了.
.\config\custom-environment-variables.json
{
"key": "app_key"
}
Run Code Online (Sandbox Code Playgroud)
.\config\default.json
{
"key": "defaultKey"
}
Run Code Online (Sandbox Code Playgroud)
赛跑
const config = require('config');
console.log(config.get('key'))
Run Code Online (Sandbox Code Playgroud)
总是打印
defaultKey
Run Code Online (Sandbox Code Playgroud)
但是当我将key
config/default中的属性设置为空字符串时,什么都不打印.我该如何解决这个问题?
node-config ×10
node.js ×10
typescript ×2
dotenv ×1
express ×1
javascript ×1
jestjs ×1
lab ×1
sequelize.js ×1
testing ×1
unit-testing ×1