Require boş bir nesne döndürür


126

İndex.js ve birkaç model (sınıf) index.js içeren bir klasörüm var

module.exports = {
   Book : require('./book'),
   Author : require('./author')
}

book.js

var Author = require('./author')
var Book = models.ActiveRecord.extend({
    schema : {
        belongsTo : {
            author : Author
        }
    }
})
module.exports = Book

author.js

var Book = require('./book')
var Author = models.ActiveRecord.extend({
    schema : {
        hasMany : {
            author : Book
        }
    }
})

module.exports = Author

Sorun şu ki Yazar sınıfı Kitabı bulamıyor! Bu sadece boş bir Nesne. Ancak, index.js'de dışa aktarımı değiştirirsem, Kitabı Yazardan sonra koyarsam - çalışır, ancak diğer model çalışmayı durdurur.

Çalışması için herhangi bir hack yapmak istemiyorum.


4
Author.js'nin çalışması için Book.js'ye ve Book.js'nin çalışması için Author.js'ye ihtiyacı var mı? Döngüsel bağımlılığı kaldırın.
Philipp Gayret

1
Bu hangi ActiveRecord nesnesi? Bu nereden?
BT

Yanıtlar:


208

Bunun nedeni, döngüsel bir bağımlılığa sahip olmanızdır. Node.js bunu çok özel bir şekilde ele alır:

  1. İlk modül yüklenir ve çalışır (bu durumda, book.js). It ( book.js) , diğer ( ) işlevini gerektirdiğinde ikinci modülü ( author.js) yükleyecek ve çalıştıracaktır.book.jsauthor.js

  2. İkinci modül ( author.js) yüklendiğinde ve çalıştırıldığında, it ( author.js) ilk modülü ( ) gerektirir, book.jsancak ( author.js) kısmen doldurulmuş bir nesneyi alır - bununla birlikte, book.js'deki dışa aktarmalarda, author.js gerekmeden önce birçok şey ayarlanmıştır. o nesnenin içinde olmak

  3. Sonra book.jstamamen içinden çalıştırılır, nesne author.jsaldığı require('./book')dolu olacak book.jsmodül nesnesi

Daha fazla bilgi için dokümanlar: http://nodejs.org/api/modules.html

Bu şemayı bu ActiveRecord nesnelerinden birine dinamik olarak eklemek mümkünse, bunu çözmenin bir yolu budur. Bu aslında biraz zor bir durum. Aslında modül sistemi olmasa bile bu sizin için sorunlara neden olabilir. Tüm bu kodu tek bir dosyaya koyarsanız, nasıl çalışmasını sağlarsınız?


1
Her şeyi tek bir dosyaya koymamalısın biliyorum, ama ben sadece böyle deney yap diyorum. Demek istediğim, burada soruna neden olan node.js'nin modül sistemi değil, kodun kendisidir.
BT

Ve aslına bakılırsa, Java'nın döngüsel bağımlılıklarla aynı sorunları var - bu her dilin sahip olabileceği bir sorun. İhtiyacınız olan tek şey döngüsel bağımlılık ortağınıza bir referanssa, javascript bunu java kadar kolay bir şekilde yapabilir. Ancak, burada, nesneyi inşa edilmeden önce kullanmaya çalışıyorsunuz (kapsamda)
BT

Evet, aslında şimdi anladım. Hiç aklıma gelmedi. Öyleyse, dinamik olarak eklemenin tek bir yolu var, sanırım. Veya bir model adını dizge olarak iletmek. Cevabınız için teşekkürler!
user3677173

18
Bu tür sorunları daha karmaşık durumlarda (yani daha fazla dosyayla) ayıklamak için Madge'yi şiddetle tavsiye ederim . Kurulduktan sonra madge -c <app entry point>herhangi bir döngüsel bağımlılığı tespit etmek için kullanabilirsiniz .
schu34

7
Teşekkürler. Hata bile vermemesi, sadece boş bir nesne döndürmesi oldukça acı verici.
Robert Oschler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.