2014-04-28 13 views
15

Ich habe die folgenden 3 Dateien.Können Knotenmodule einander benötigen

user.js erfordert room.js und room.js erfordert user.js.

user.js

var Room = require('./room.js'); 

var User = function() {}; 
User.prototype.test = function() { 
    return new Room(); 
}; 

module.exports = User; 

room.js

var User = require('./user.js'); 

var Room = function() {}; 
Room.prototype.test = function() { 
    return new User(); 
}; 

module.exports = Room; 

index.js

var User = require('./user.js'); 
var Room = require('./room.js'); 

var user = new User(); 
var room = new Room(); 

user.test(); 
room.test(); 

index.js erfordert sowohl Zimmer und Benutzer.

Hier ist das Problem. Wenn ich index.js ausführe, erhalte ich einen TypeError von 'new User()' in room.js. Es scheint, dass der Benutzer in room.js vom Benutzer in index.js versteckt ist.

Mache ich etwas falsch? Ist das erlaubt? Irgendwelche Ideen? Vielen Dank.

Antwort

17

Auschecken http://nodejs.org/api/modules.html#modules_cycles für wie dies in Knoten behandelt wird.

Sie können auf verschiedene Weise, beispielsweise zu lösen, um die Instanzen in den Abhängigkeiten vorbei aka Dependency Injection

// user.js 
var User = function (Room) { this.Room = Room; }; 
User.prototype.test = function() { 
    return new this.Room(); 
}; 
module.exports = User; 

// room.js 
var Room = function (User) { this.User = User; }; 
Room.prototype.test = function() { 
    return new this.User(); 
}; 
module.exports = Room; 

// index.js 
var User = require('./user.js'); 
var Room = require('./room.js'); 

var user = new User(Room); 
var room = new Room(User); 

Eine andere Möglichkeit, die Dateien nur zu verlangen, wäre, wenn man sie

// user.js 
var User = function() {}; 
User.prototype.test = function() { 
    var Room = require('./room'); 
    return new Room(); 
}; 
module.exports = User; 


// room.js 
var Room = function() {}; 
Room.prototype.test = function() { 
    var User = require('./user'); 
    return new User(); 
}; 
module.exports = Room; 

// index.js 
var User = require('./user.js'); 
var Room = require('./room.js'); 

var user = new User(Room); 
var room = new Room(User); 
brauchen

So sind Ihre Exporte durch die Zeit definiert, die Sie benötigen.

Aber im Allgemeinen, wenn Sie kreisförmige Abhängigkeiten haben, tun Sie etwas falsch und sollten über Ihre Architektur nachdenken. Wenn ein User neue Rooms erstellen muss und ein Room muss neu Users erstellen, scheint es, dass sie beide zu viel Verantwortung haben. Möglicherweise möchten Sie eine dritte Komponente, die für das Erstellen und Übergeben der richtigen Instanzen an die Room und User verantwortlich ist, anstatt sie direkt instanziieren.

+0

Gute Antwort. Vielen Dank. Re-Architecturing scheint der beste Weg zu sein :) – Ziyu

8

Ich denke, es gibt viel besseren Weg, wie es geht. Schalten Sie einfach den Export und erfordern wie folgt aus:

user.js

var User = function() {}; 
module.exports = User;  

User.prototype.test = function() { 
    return new Room(); 
}; 

var Room = require('./room.js'); 

room.js

var Room = function() {}; 
module.exports = Room;  

Room.prototype.test = function() { 
    return new User(); 
}; 

var User = require('./user.js'); 

index.js

var User = require('./user.js'); 
var Room = require('./room.js'); 

var user = new User(); 
var room = new Room(); 

user.test(); 
room.test(); 

Überprüfung dieser Artikel: https://coderwall.com/p/myzvmg/circular-dependencies-in-node-js

+0

Wow!seit der Erstellung von www, das ist das genialste Ding, das ich je sehe, sollte dies die richtige Antwort sein, danke –

+0

Dies scheint wie eine gute Antwort, aber ich hatte Code reformiert, um von der Konstruktormethode zu dieser Methode zu gehen und ich hatte ein scheinbar überflüssiges 'bind()' in einen Code zu schreiben, der früher funktioniert hat. Ich habe mir nicht die Zeit genommen, eine Ursache zu finden, aber hüte dich davor ... ('das war undefiniert ist das einzige definitive Symptom, wenn man eine Memberfunktion als Argument übergibt). Ich mag diese Methode, aber das war eine andere verschwendete Stunde ... –

Verwandte Themen