Yêu cầu trả về một đối tượng trống


126

Tôi có một thư mục, có index.js và một vài mô hình (lớp) index.js

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

tác giảr.js

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

module.exports = Author

Vấn đề là lớp Tác giả dường như không tìm thấy Sách! Nó chỉ là một Object rỗng. Tuy nhiên, nếu tôi chuyển các xuất trong index.js, đặt Sách sau Tác giả - nó hoạt động, nhưng sau đó mô hình khác ngừng hoạt động.

Tôi không muốn thực hiện bất kỳ cuộc tấn công nào để làm cho nó hoạt động.


4
Author.js cần Book.js để chạy và Book.js cần Author.js để chạy? Loại bỏ sự phụ thuộc vòng tròn.
Philipp Gayret

1
Đối tượng ActiveRecord là gì? Nó đến từ đâu?
BT

Câu trả lời:


208

Điều này là do bạn có một sự phụ thuộc vòng tròn. Node.js xử lý điều này theo một cách rất cụ thể:

  1. Mô-đun đầu tiên tải và chạy (trong trường hợp này là book.js). Nó ( book.js) sẽ tải và chạy mô-đun thứ hai ( author.js) khi nó ( book.js) yêu cầu cái kia ( author.js)

  2. Khi mô-đun thứ hai ( author.js) được tải và chạy, nó ( author.js) yêu cầu mô-đun đầu tiên ( book.js) nhưng nó ( author.js) sẽ nhận một đối tượng được lấp đầy một phần - tuy nhiên, nhiều thứ đã được thiết lập trên các bản xuất trong book.js trước khi nó yêu cầu tác giả.js sẽ ở trong đối tượng đó

  3. Sau khi book.jshoàn toàn chạy qua, đối tượng author.jsnhận được từ require('./book')sẽ là book.jsđối tượng mô-đun đầy đủ

Để biết thêm thông tin, đây là tài liệu: http://nodejs.org/api/modules.html

Nếu có thể thêm động lược đồ đó vào một trong các đối tượng ActiveRecord đó, đó là một cách để giải quyết vấn đề này. Đây thực sự là một tình huống khó khăn. Trên thực tế, ngay cả khi không có hệ thống mô-đun, điều này sẽ gây ra vấn đề cho bạn. Nếu bạn đặt tất cả mã này trong một tệp, bạn sẽ làm cho nó hoạt động như thế nào?


1
Tôi biết bạn không nên đặt mọi thứ trong một tệp, nhưng tôi đang nói chỉ thử nghiệm như vậy. Quan điểm của tôi là không phải hệ thống mô-đun của node.js đang gây ra vấn đề ở đây, nó là chính mã.
BT

Và trên thực tế, Java cũng có những vấn đề tương tự với các phụ thuộc vòng tròn - một vấn đề mà bất kỳ ngôn ngữ nào cũng có thể gặp phải. Nếu tất cả những gì bạn cần là tham chiếu đến đối tác phụ thuộc vòng tròn của bạn, javascript có thể làm điều đó dễ dàng như java. Tuy nhiên, ở đây, bạn đang cố gắng sử dụng đối tượng trước khi nó được xây dựng (trong thời gian dài)
BT

Vâng, thực sự bây giờ tôi đã hiểu nó. Không bao giờ nghĩ đến. Vì vậy, chỉ có một cách - thêm động, tôi đoán vậy. Hoặc chuyển một tên mô hình dưới dạng một chuỗi. Cám ơn phản hồi của bạn!
user3677173

18
Tôi thực sự khuyên bạn nên Madge gỡ lỗi các loại vấn đề này trong các trường hợp phức tạp hơn (tức là với nhiều tệp hơn). Sau khi cài đặt, bạn có thể sử dụng madge -c <app entry point>để phát hiện bất kỳ phụ thuộc vòng tròn nào.
schu34

7
Cảm ơn. Khá đau đớn là nó thậm chí không ném ra một lỗi mà chỉ trả về một đối tượng trống.
Robert Oschler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.