2012-03-09 26 views
5

Tôi không nghĩ rằng tôi hoàn toàn hiểu cách exports hoạt động trong Node.js. Trong một chút mã mẫu, tôi nhận thấy các đối tượng exports sử dụng theo cách này:Hiểu sự xuất khẩu trong NodeJS

exports = mongoose = require('mongoose') 
mongoose.connect(config.db.uri) 
exports = Schema = mongoose.Schema 

gì đang xảy ra đằng sau hậu trường khi bạn sử dụng exports = hai lần như thế? Có vẻ như tôi không muốn xuất khẩu "mongoose". Tôi đã làm thử nghiệm nhanh này:

var foo 
    , bar 

exports = foo = 'foo' 
exports = bar = 'bar' 

// reports 'bar' only 
console.log(exports) 

và kiểm tra thứ hai không ghi đè xuất khẩu đầu tiên.

+0

Vâng, điều đó thật lạ. Thông thường, bạn sẽ mong đợi một 'exports.foo = 'foo'', v.v. –

+2

Có thể là mongoose.Schema trỏ đến mongoose. –

+0

Tôi chỉ cố gắng tìm ra điều này, và tốt nhất tôi có thể nói, cả 3 dòng đều không làm gì cả. Bằng cách thiết lập đối tượng xuất khẩu, đối tượng xuất khẩu toàn cầu bị mất. Vì vậy, không có gì được xuất ra khỏi tệp này. Điều quan trọng khác là các biến (mongoose & Schema) đang được định nghĩa cho đối tượng toàn cầu. Điều này có vẻ giống như một cách để gắn cờ rằng các biến này sẽ là hình cầu và tệp này sẽ không xuất các biến đó qua giao diện mô-đun. Tôi không thể thấy bất kỳ lý do nào khác để làm điều này. – sujal

Trả lời

15

Đoán của tôi là tác giả gốc của mã mẫu đó bị nhầm lẫn về module.exports so với exports. Để sử dụng các đối tượng exports, bạn phải thêm các thuộc tính để nó như thế này:

exports.size = 42; 

Nếu bạn tái giao exportsbiến đến một đối tượng mới, về cơ bản bạn mất quyền truy cập vào kim ngạch xuất khẩu toàn cầu phản đối rằng Node.js được cung cấp cho bạn. Nếu bạn làm điều này hai lần hoặc ba hoặc N lần, hiệu quả là như nhau. Nó vô dụng. Ví dụ: mod_b.js

var realExports = exports; 
realExports.height = 42; 
var exports = {}; 
exports.weight = 43; 

Và trong mod_a.js

var mod_b = require('./mod_b'); 
console.dir(mod_b); 

Run node mod_a.js và bạn nhận được:

{ height: 42 } 

Thông báo height là có nhưng không phải là weight. Bây giờ, những gì bạn có thể làm là gán module.exports làm đối tượng và đó là đối tượng sẽ được trả lại khi một mô-đun khác của bạn mô-đun require. Vì vậy, bạn sẽ thấy những thứ như thế.

var x = 10; 
var y = 20; 
module.exports = {x: x, y: y}; 

Điều gì sẽ làm những gì bạn mong đợi. Dưới đây là một số thông tin chi tiết về các chi tiết.

Node.js Module – exports vs module.exports

What is the purpose of NodeJS module.exports and how do you use it?

Mastering Node

+0

Liên kết Mastering Node rất hữu ích. Cảm ơn bạn. –

1

Là một phần mở rộng @ Peter-Lyons câu trả lời, ví dụ của bạn là hợp lệ, trường hợp thử nghiệm của bạn là không chính xác.

Xuất các biến như thế này không được khuyến khích, nhưng bằng cách làm điều đó, bạn đang hiển thị các biến này thành không gian tên chung.

ví dụ: test0.js

'use strict'; 

var assert = require('assert'); 
var test1 = require('./test1'); 

assert(globalVar1 === 123); 
assert(globalVar2.a === 123); 

test1.js - tâm sự thiếu 'use strict';

exports = globalVar1 = 123; 
exports = globalVar2 = {a:123}; 

Một lần nữa, đó là hợp lệ, nhưng không khuyến khích.

Chúc mừng.

Các vấn đề liên quan