Node.js変数共有方法
Node.jsでファイルを跨いで変数を共有する
Node.jsでは、通常、異なるファイル間で変数を直接共有することはできません。これは、Node.jsがシングルスレッドイベントループモデルを採用しているためです。各ファイルは独立したモジュールとして扱われ、独自のスコープを持ちます。
しかし、いくつかの方法を使用して、ファイルを跨いで変数を共有することができます。
グローバルオブジェクト(global)
- ここに変数を定義することで、他のファイルから参照できます。
- Node.jsのグローバルオブジェクトは、すべてのモジュールからアクセス可能です。
// global.js
global.sharedVariable = 'Hello, world!';
// otherFile.js
console.log(global.sharedVariable); // Output: Hello, world!
注意
グローバル変数の過剰使用は、コードの可読性と保守性を低下させる可能性があります。
モジュールシステム
- Node.jsのモジュールシステムを使用して、変数をエクスポートし、他のモジュールからインポートすることができます。
// sharedModule.js
let sharedValue = 42;
module.exports = {
sharedValue
};
// otherFile.js
const { sharedValue } = require('./sharedModule');
console.log(sharedValue); // Output: 42
プロセス環境変数
- これを利用して、異なるファイル間で情報を共有することができます。
- Node.jsのプロセス環境変数は、システムレベルで設定された変数です。
// setEnvironmentVariable.js
process.env.MY_VARIABLE = 'Some value';
// otherFile.js
console.log(process.env.MY_VARIABLE); // Output: Some value
データベースやファイルシステム
- データベースやファイルシステムを使用して、データを永続化し、複数のファイルからアクセスすることができます。
選択基準
- データベースやファイルシステム
大量のデータや複雑なデータ構造を扱う場合に適しています。 - プロセス環境変数
システムレベルの変数を利用し、環境設定に適しています。 - モジュールシステム
最も一般的な方法で、コードの構造化に役立ちます。 - グローバルオブジェクト
簡単ですが、コードの可読性と保守性に影響を与えます。
ベストプラクティス
- データベースやファイルシステムは、適切な場合に使用する。
- プロセス環境変数は、環境設定に関連する情報を共有するのに適している。
- モジュールシステムを活用して、コードを整理する。
- グローバル変数の使用は最小限に抑える。
// global.js
global.sharedVariable = 'Hello, world!';
// otherFile.js
console.log(global.sharedVariable); // Output: Hello, world!
// sharedModule.js
let sharedValue = 42;
module.exports = {
sharedValue
};
// otherFile.js
const { sharedValue } = require('./sharedModule');
console.log(sharedValue); // Output: 42
// setEnvironmentVariable.js
process.env.MY_VARIABLE = 'Some value';
// otherFile.js
console.log(process.env.MY_VARIABLE); // Output: Some value
// database.js
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('mydatabase.db');
db.run(`CREATE TABLE IF NOT EXISTS shared_data (value TEXT)`);
// setSharedData.js
db.run(`INSERT INTO shared_data (value) VALUES (?)`, ['Shared value']);
// getSharedData.js
db.get(`SELECT value FROM shared_data`, (err, row) => {
if (err) {
console.error(err);
} else {
console.log(row.value); // Output: Shared value
}
});
クラスとインスタンス
- JavaScriptのクラスを使用して、変数をカプセル化し、複数のファイルからアクセスすることができます。
// SharedClass.js
class SharedClass {
constructor() {
this.sharedValue = 'Shared value';
}
}
// otherFile.js
const sharedInstance = new SharedClass();
console.log(sharedInstance.sharedValue); // Output: Shared value
イベントエミッター
- Node.jsの
EventEmitter
クラスを使用して、イベントを発行し、他のファイルでリスナーを登録することで、情報を共有することができます。
// eventEmitter.js
const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.on('sharedEvent', (data) => {
console.log('Received data:', data);
});
// otherFile.js
emitter.emit('sharedEvent', 'Shared data');
メッセージキュー
- メッセージキューを使用して、異なるプロセスやマシン間で情報を非同期に共有することができます。
// producer.js
const amqp = require('amqplib');
amqp.connect('amqp://localhost')
.then(conn => conn.createChannel())
.then(ch => {
const q = 'hello';
ch.assertQueue(q, {durable: false});
ch.sendToQueue(q, Buffer.from('Hello from producer!'));
console.log(" [x] Sent 'Hello from producer!'");
return ch.close();
})
.catch(console.warn);
// consumer.js
amqp.connect('amqp://localhost')
.then(conn => conn.createChannel())
.then(ch => {
const q = 'hello';
ch.assertQueue(q, {durable: false});
ch.consume(q, msg => {
console.log(" [x] Received '%s'", msg.content.toString());
}, {noAck: true});
})
.catch(console.warn);
javascript node.js global-variables