2012-01-15 39 views
9

Tôi đang sử dụng Express và tôi cần sử dụng thông tin đăng nhập khác nhau cho mỗi máy chủ (dàn dựng và sản xuất).Node.js: Cách thiết lập các biến khác nhau cho sản xuất và dàn dựng

Tôi có thể thiết lập các biến trong tệp server.coffee nhưng sau đó tôi cần truy cập các biến đó trong các tệp khác nhau.

server.coffee: 

app.configure 'production',() -> 
app.use express.errorHandler() 

Giải pháp là gì? Thiết lập các biến và sau đó xuất chúng?

Trả lời

1

Nếu bạn không muốn logic xác định cấu hình nào sẽ sử dụng trong mỗi tệp (trông sẽ rất xấu), bạn sẽ phải xuất nó ở đâu đó.

Điều tôi muốn đề xuất: Có tệp config.json chứa các cấu hình khác nhau. Các tập tin chính đòi hỏi nó và làm một cái gì đó như config.default = config.(condition ? 'production':'development'). Trong tất cả các tệp khác, bạn hiện có thể thực hiện require('./config').default.

1

Tôi có một ứng dụng sử dụng ba phương pháp khác nhau để khai báo biến cấu hình (uris, khóa api, thông tin đăng nhập, v.v.) tùy thuộc vào môi trường (production = biến môi trường; staging = command line args; local = config files.) tôi đã viết một chút "config" mô-đun để xử lý sáp nhập tất cả các tùy chọn này thành một đối tượng mà tôi có thể sử dụng trong các ứng dụng của tôi và tải nó như là một ý chính: https://gist.github.com/1616583

nó có thể không được thực hiện tốt nhất, nhưng nó được làm việc khá tốt cho đến nay :).

19

./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; 

./app.js

var cfg = require('./config').Config; 

if (cfg.something) { // switch on environment 
    // your logic 
} 
+0

Tôi không hiểu mã app.js. Tôi thiết lập các biến trong config.js nhưng sau đó, làm thế nào tôi có thể "đọc" chúng trong app.js của tôi? – donald

+1

Dòng cuối cùng trong ./config.js cho phép bạn xuất mã đó vào tệp ./app.js của bạn. ./config.js trả về đối tượng json thích hợp tùy thuộc vào môi trường của bạn, và sau đó bạn đặt biến cfg thành đối tượng json đó. Một sai lầm, mặc dù. config.something nên là cfg.một cái gì đó bởi vì đó là tên của biến mà bạn đang tạo. –

+0

Đảm bảo bạn đã đặt biến cấu hình 'NODE_ENV' trên máy chủ sản xuất của mình. Với Heroku nó sẽ là 'heroku config: đặt NODE_ENV = production'. Nếu không làm như vậy, dòng cuối cùng của 'config.js' sẽ không hoạt động. –

2

Tôi đã tải lên một thực hiện vào https://github.com/qiangyu/nodejsconfig. Tôi tin rằng nó sẽ đáp ứng nhu cầu của bạn. Về cơ bản, bạn chỉ cần cung cấp một file cấu hình:

dev.appAddress = '127.0.0.1:3000'; 
prod.appAddress = 'someDomain.com'; 

Sau đó, bạn sử dụng đoạn mã sau để đọc appAddress trong môi trường sản:

var xnconfig = require('nodejsconfig'); 
var fs = require('fs'); 

var data = fs.readFileSync(__dirname+"/config.properties", "UTF8"); 

// assume we will be using environment "prod" 
var config = xnconfig.parse("prod", data); 

// the output will be someDomain.com 
console.log(config.getConfig("appAddress")); 
6

Đây có thể là một nơi tốt để sử dụng npm-config.

Khi chạy script (xem NPM-scripts (7)) các package.json "config" chìa khóa sẽ bị ghi đè trong môi trường nếu có một param cấu hình của <name>[@<version>]:<key>

tôi sẽ không sử dụng chúng cho mọi loại cài đặt cấu hình biến, nhưng tôi nghĩ đó là giải pháp tốt cho các trường hợp đơn giản như URL và cổng vì:

  1. Bạn đặt chúng trực tiếp vào package.json.
  2. Ngoài ra, bạn có thể chỉ định chúng trên dòng lệnh hoặc dưới dạng biến ENV.
  3. Mọi thứ chạy qua npm đều có thể tham chiếu đến chúng (ví dụ: tập lệnh).
  4. Bạn có thể cài đặt chúng cho mỗi người dùng với `NPM cấu hình bộ foo: cổng 80

Thông báo trước một được rằng config tham số trong package.json của bạn chỉ được tự động xuất ra môi trường khi bạn chạy mã của bạn qua npm. Vì vậy, nếu bạn chỉ chạy nó với nút, như, node ./myapp.js, thì bạn không thể mong đợi rằng process.env.npm_package_config_foo sẽ chứa giá trị của bạn. Tuy nhiên, bạn luôn có thể var pkg = require('./package.json'); và truy cập các giá trị tại pkg.config.

Bởi vì nó có thể không rõ ràng ngay lập tức, tôi cũng thêm rằng các biến môi trường npm_package_config không bong bóng lên đến các ứng dụng phụ thuộc vào gói npm của bạn. Vì vậy, nếu gói phụ thuộc của bạn đề cập đến process.env.npm_package_config_foo, thì gói phụ thuộc sẽ phải xác định rằng trong package.json của chính nó. Tôi đoán vì nó là một "npm_package_config" nó sẽ không có ý nghĩa để đẩy tất cả các con đường lên cây.

Vì vậy, làm thế nào tôi sẽ sử dụng một biến cấu hình npm và có nó hoạt động tất cả các cách lên cây, trong cả hai gói cơ sở và các gói phụ thuộc vào nó? Nó thực sự là một chút khó hiểu, và tôi đã phải tìm ra điều này thông qua thử và sai.

Giả sử bạn có một gói trình kết nối và gói khách hàng. ứng dụng khách tùy thuộc vào đầu nối và bạn muốn chỉ định thông số cấu hình cho đầu nối có thể được sử dụng hoặc ghi đè trong ứng dụng khách. Nếu bạn sử dụng process.env.npm_package_config.port trong mô-đun connector của mình, thì khi nó phụ thuộc vào mô-đun khách hàng, thì biến đó sẽ không được xuất và sẽ kết thúc dưới dạng không xác định.

Tuy nhiên, nếu bạn sử dụng thay process.env.npm_config_connector_port (chú ý là người đầu tiên bắt đầu với npm_package_config và khác với npm_config_packagename), sau đó bạn ít nhất có thể thiết lập rằng trong .npmrc bạn sử dụng npm config set connector:port 80 và nó sẽ được "namespaced" dưới dạng process.env.npm__config_connector_port ở mọi nơi bạn chạy npm, bao gồm các tập lệnh mà bạn chạy trong khách hàng phụ thuộc vào đầu nối và bạn sẽ luôn có thể ghi đè lên dòng lệnh, trong ENV hoặc trong .npmrc. Bạn chỉ cần nhớ rằng, như với bất kỳ biến môi trường nào, nó có thể không phải lúc nào cũng được thiết lập. Vì vậy, tôi sẽ sử dụng các nhà điều hành mặc định với process.env.npm_config_connector_port như giá trị đầu tiên (ưu tiên):

var port = process.env.npm_config_connector_port || sane_default

Ở đây, sane_default có thể được dân cư từ một trong những phương pháp khác được đề nghị. Cá nhân, tôi thích giữ dữ liệu cấu hình như thế này trong tệp JSON ít nhất, và package.json có vẻ giống như tệp JSON tốt nhất để đưa chúng vào. Lưu trữ chúng trong dữ liệu thay vì mã và sau đó bạn có thể dễ dàng sử dụng JSON tĩnh trong dòng, tạo chúng động hoặc kéo chúng từ hệ thống tệp, URL hoặc cơ sở dữ liệu.

Các vấn đề liên quan