グローバルvar
が最良の選択肢であるシナリオを見つけることはできませんが、もちろん1つはありますが、これらの例を確認すると、同じことを達成するためのより良い方法が見つかる場合があります。
シナリオ1:構成ファイルにデータを配置する
アプリケーション全体で同じである値が必要ですが、環境(本番、開発、またはテスト)、例としてメーラータイプによって異なります。
// File: config/environments/production.json
{
"mailerType": "SMTP",
"mailerConfig": {
"service": "Gmail",
....
}
そして
// File: config/environments/test.json
{
"mailerType": "Stub",
"mailerConfig": {
"error": false
}
}
(開発用にも同様の設定を行います)
ロードする構成を決定するには、メイン構成ファイルを作成します(これはアプリケーション全体で使用されます)
// File: config/config.js
var _ = require('underscore');
module.exports = _.extend(
require(__dirname + '/../config/environments/' + process.env.NODE_ENV + '.json') || {});
そして今、あなたはこのようなデータを得ることができます:
// File: server.js
...
var config = require('./config/config');
...
mailer.setTransport(nodemailer.createTransport(config.mailerType, config.mailerConfig));
シナリオ2:定数ファイルを使用する
// File: constants.js
module.exports = {
appName: 'My neat app',
currentAPIVersion: 3
};
そして、それをこのように使用します
// File: config/routes.js
var constants = require('../constants');
module.exports = function(app, passport, auth) {
var apiroot = '/api/v' + constants.currentAPIVersion;
...
app.post(apiroot + '/users', users.create);
...
シナリオ3:ヘルパー関数を使用してデータを取得/設定する
これの大ファンではありませんが、少なくとも「名前」(OPの例を引用)の使用を追跡し、検証を行うことができます。
// File: helpers/nameHelper.js
var _name = 'I shall not be null'
exports.getName = function() {
return _name;
};
exports.setName = function(name) {
//validate the name...
_name = name;
};
そしてそれを使う
// File: controllers/users.js
var nameHelper = require('../helpers/nameHelper.js');
exports.create = function(req, res, next) {
var user = new User();
user.name = req.body.name || nameHelper.getName();
...
グローバルを使用する以外に解決策がない場合の使用例も考えられvar
ますが、node.jsを使用し始めた場合(以前のように)、通常はこれらのシナリオのいずれかを使用してアプリのデータを共有できます。そこにあるデータを処理する方法を整理します。