48

main.js

var count = 1;

// psuedocode
// if (words typed begins with @add)
require('./add.js');

// if (words typed begins with @remove)
require('./remove.js');

// if (words typed begins with @total)
require('./total.js');



module.exports.count = count;

total.js

var count = require('./main.js').count;
console.log(count);

add.js

var count = require('./main.js').count;
count += 10;
console.log(count);

remove.js

var count = require('./main.js').count;
count -= 10;
console.log(count);

console.log

 1
 11
 -9

バックグラウンド:

私はアプリケーション (irc ボット) を持っていて、peeps が @add 1 または @remove 1 を実行できる機能を追加したいと考えています。したがって、add は add.js ファイルをトリガーし、require('main.js') に 10 (単純化のために 10、実際には数値を解析してその数値を使用します) を追加します。私が抱えている問題は、誰かが行って @remove を実行したときです。これは require('main.js') で、1 から 10 を引いて -9 になります。@total を実行すると、1 が出力されます。

module.exports をかなりよく検索しましたが、上記のような例は見つかりませんでした。 ドキュメントには、私がやりたいことに近い例は含まれていません。これらの質問12は理解していますが、そこで言われていることは理解しているので、私にとっては何の役にも立ちません。

質問:

@add と @remove の両方で同じ変数 ( count ) を操作し、@total が @add と @remove を考慮して count の合計を返すようにしたいと考えています。module.exports を間違って使用していますか? または、1 つのファイルで module.exports の内容を変更し、結果を main.js ファイルに返すことができる、変数を共有する一般的な方法はありますか?

4

7 に答える 7

62

あなたの問題は、あなたがするときvar count = require('./main.js').count;、参照ではなくその番号のコピーを取得することです。変更countしても「ソース」は変更されません。

ただし、ファイルのエクスポート機能が必要です。ファイルを要求すると、初回のみ実行されますが、その後はキャッシュされ、再実行されません。ドキュメントを参照

提案#1:

// main.js
var count = 1;
var add = require('./add.js');
count = add(count);

// add.js
module.exports = function add(count) {
    return count+10;
}

#2:

var count = 1;
var add = function() {
    count += 10;
}
add();

#3:個人的にはカウンターモジュールを作成します(これは単一のインスタンスですが、簡単に「クラス」にすることができます):

// main.js
var counter = require('./counter.js');
counter.add();
console.log(counter.count);

// counter.js
var Counter = module.exports = {
    count: 1,
    add: function() {
        Counter.count += 10;
    },
    remove: function() {
        Counter.count += 10;
    }
}
于 2013-06-15T04:26:46.713 に答える
14

これが新しいかどうかはわかりませんが、実際にファイル間で変数を共有することができます:

main.js

exports.main = {
    facebook: null
};

counter.js

var jamie = require('./main'); 
console.info(jamie); //{facebook: null}
jamie.main.facebook = false;
console.info(jamie); //{facebook: false}

anothercheck.js

var jamie = require('./main'); 
console.info(jamie); //{facebook: null} //values aren't updated when importing from the same file.
jamie.main.facebook = true;
console.info(jamie); //{facebook: true}

これで、ファイル間で共有できます。

于 2016-06-07T13:45:41.280 に答える
7

私はあなたと同じ問題を抱えています..モジュラースタイルが好きなので、複数のファイル間で変数を共有したい場合があります。node.jsスクリプトのさまざまなフォルダー/ファイルにコントローラー、関数、モデルを分離して、コードを簡単に管理できるようにします。

これが最善の解決策かどうかはわかりませんが、あなたのニーズに合うことを願っています。

モデル/data.js

// exports empty array
module.exports = [];

コントローラー/somecontroller.js

var myVar = require('../models/data');
myVar.push({name: 'Alex', age: 20});
console.log(myVar);
//  [{ name: 'Alex', age: 20 }]

コントローラー/anotherController.js

var myVar = require('../models/data');

console.log(myVar);
// This array has value set from somecontroller.js before...
//  [{ name: 'Alex', age: 20 }]

// Put new value to array
myVar.push({name: 'John', age: 17});
console.log(myVar);
// Value will be added to an array
//  [{ name: 'Alex', age: 20 }, { name: 'John', age: 17}]
于 2016-06-09T16:58:07.287 に答える