don*_*ald 10 javascript node.js coffeescript express
我正在使用Express,我需要为每个服务器使用不同的凭据(登台和生产).
我可以在server.coffee文件中设置变量,但之后我需要在不同的文件中访问这些变量.
server.coffee:
app.configure 'production', () ->
app.use express.errorHandler()
Run Code Online (Sandbox Code Playgroud)
解决方案是什么?设置变量然后导出它们?
Pon*_*ono 20
./config.js
var development = {
appAddress : '127.0.0.1:3000',
socketPort : 4000,
socketHost : '127.0.0.1',
env : global.process.env.NODE_ENV || 'development'
};
var production = {
appAddress : 'someDomain.com',
socketPort : 4000,
socketHost : '8.8.8.8',
env : global.process.env.NODE_ENV || 'production'
};
exports.Config = global.process.env.NODE_ENV === 'production' ? production : development;
Run Code Online (Sandbox Code Playgroud)
./app.js
var cfg = require('./config').Config;
if (cfg.something) { // switch on environment
// your logic
}
Run Code Online (Sandbox Code Playgroud)
小智 6
这可能是使用npm-config的好地方.
运行脚本时(参见npm-scripts(7)),如果有一个配置参数,则会在环境中覆盖package.json"config"键.
<name>[@<version>]:<key>
我不会将它们用于每种类型的变量配置设置,但我认为这对于URL和端口等简单情况来说是一个很好的解决方案,因为:
需要注意的是,config当您通过npm运行代码时,package.json 中的参数只会自动导出到环境中.所以,如果你只是用节点运行它,比如node ./myapp.js,那么你不能指望它process.env.npm_package_config_foo会包含你的价值.但是,您始终可以var pkg = require('./package.json');访问值pkg.config.
因为它可能不是很明显,我还要补充一点,npm_package_config环境变量不会冒泡到依赖于你的npm包的应用程序.因此,如果你的依赖包引用process.env.npm_package_config_foo,那么依赖包必须在它自己的package.json中定义它.我想因为它是一个"npm_package_config",将它们一直推到树上是没有意义的.
那么,我如何使用一个npm配置变量并让它在基础包和依赖它的包中一直向上运行?这实际上有点令人困惑,我不得不通过反复试验来解决这个问题.
假设您有一个包连接器和包客户端.客户端依赖于连接器,并且您希望为连接器指定可在客户端中使用或覆盖的配置参数.如果您process.env.npm_package_config.port在连接器模块中使用,那么当它在客户端模块中依赖时,那么该变量将不会被导出,并且最终将被定义为未定义.
但是,如果您改为使用process.env.npm_config_connector_port(注意第一个以npm_package_config开头,另一个使用npm_config_packagename),那么您至少可以在.npmrc中使用npm config set connector:port 80它来设置它,并且它将process.env.npm__config_connector_port在您运行npm的所有位置"命名空间" ,包括脚本您在依赖于连接器的客户端中运行,并且您始终可以在命令行,ENV或.npmrc中覆盖它.您必须记住,与任何环境变量一样,它可能并不总是被设置.所以,我会使用默认运算符作为第一个(首选)值:process.env.npm_config_connector_port
var port = process.env.npm_config_connector_port || sane_default
在这里,sane_default可以从其他推荐方法之一填充.就个人而言,我喜欢至少在JSON文件中保存这些配置数据,而package.json似乎是最好的JSON文件.将它们存储在数据而不是代码中,然后您可以轻松地使用静态JSON - line,动态生成它们,或从文件系统,URL或数据库中提取它们.
如果您不想要确定每个文件中使用哪个配置的逻辑(这看起来相当难看),则必须将其导出到某个地方。
我的建议是:有一个config.json包含不同配置的文件。主文件需要它并执行类似config.default = config.(condition ? 'production':'development'). 在所有其他文件中,您现在可以执行require('./config').default.
| 归档时间: |
|
| 查看次数: |
5799 次 |
| 最近记录: |