2013-08-09 5 views
3

я наткнулся на код, который идет как этотКак экспортировать экспресс экземпляра работы

express = require('express'); 
app = express(); 
app.use(require('./lib/file.js')); 
app.listen(80); 

с file.js содержащего

express = require('express'); 
app = module.exports = express(); 
app.get('/blah', function(a,b){}); 
app.post('/blah', function(a,b){}); 
//And so on.. 

Может кто-нибудь объяснить, как это работает app = module.exports = express() линии?

+0

Вы увидите такое дерьмо во многих модулях Node.js. Не уверен, почему люди просто не помещают 'module.exports = app;' в конце своего кода модуля. – Pickels

ответ

1
app = module.exports = express() 

может быть также записана в виде:

app = express() 
app.get('/blah', function(a,b){}); 
app.post('/blah', function(a,b){}); 
module.exports = app 

Так он устанавливает экспорт модуля к экземпляру экспресс-приложения (которое, в свою очередь, представляет собой connect приложение).

Интересной частью является app.use(require('./lib/file.js'));, которая в основном устанавливает это экспортируемое приложение как промежуточное программное обеспечение для подключения. Это возможно, потому что приложения для подключения фактически являются функциями, которые могут использоваться в качестве промежуточного программного обеспечения. Вы можете видеть это ясно, глядя на код, который создает их:

function createServer() { 
    //the magic happens in the next line: 
    function app(req, res, next){ app.handle(req, res, next); } 
    utils.merge(app, proto); 
    utils.merge(app, EventEmitter.prototype); 
    app.route = '/'; 
    app.stack = []; 
    for (var i = 0; i < arguments.length; ++i) { 
     app.use(arguments[i]); 
    } 
    return app; 
}; 

В основном это один из способов поставить маршруты в отдельный файл (в данном случае file.js).

2

Во-первых, это устанавливает, что экспорт текущего модуля идентичен экземпляру экспресс-приложения.

module.exports = express(); 

Эта часть строки создает локальный псевдоним для module.exports.

app = module.exports 

Файл, который вы нашли, также может быть написан следующим образом, без алиаса «приложение» для визуальной эстетики.

express = require('express'); 
module.exports = express(); 
module.exports.get('/blah', function(a,b){}); 
module.exports.post('/blah', function(a,b){}); 

Также обратите внимание, что наличие всего этого в двух файлах является избыточным. Приложение создает два экземпляра экспресс-приложения, а затем один из этих экземпляров прослушивает другой.

+0

Что вы рекомендуете вместо двух экспресс-экземпляров? – mgoszcz2

+1

@ mgoszcz2 вы можете иметь модуль, экспортирующий функцию, которая принимает основное приложение в качестве параметра, а «обогащает» с помощью маршрутов, а затем вызывает его в основном модуле. Я бы не стал беспокоиться о дополнительном экземпляре. – soulcheck

+0

Я согласен с @soulcheck, это не проблема. Я просто указал на это, потому что это не обычное дело, и я хотел помочь проиллюстрировать, как работает экспресс. В наших приложениях для узлов мы обычно просто обходим экземпляр приложения для маршрутизации модулей. Итак, у нас есть каталог «маршруты» и модули для организации различных связанных маршрутов. Мы просто требуем каждый модуль маршрута и передаем экземпляр приложения Singleton Express для каждого модуля. Внутренне модули просто присоединяют свои маршруты. –

Смежные вопросы