2011-11-14 1 views
1

Я разрабатываю пакет NPM, для которого требуется модуль из корня приложения. Подумайте об этом как о пакете, требующем модуля свойств, который размещен пользователем в корне приложения.NPM - путь к корню приложения

Как я могу получить путь к корню приложения?

UPDATE:

Чтобы подвести итог, что я пытаюсь сделать, экспресс позволяет сделать что-то вроде этого:

app.use(express.router(myNPMModule.router)); 

Функция маршрутизатор получит app в качестве параметра. Идея состоит в том, чтобы позволить пользователям указывать маршруты в отдельном файле, и им просто нужно следовать определенным соглашениям, например, поместить свои контроллеры в папку /controllers, а мой модуль сможет динамически анализировать путь, а затем вызвать правильный метод в правильном модуле. Я уже работал, но понял, что если я упакую его в NPM, у меня больше нет доступа к пути к приложению, поэтому я не могу динамически вызывать метод модуля контроллера.

+0

Вы не должны этого делать, вместо этого попросите пользователя вызвать конструктор (или любую имеющуюся у вас функцию) со свойствами. – alessioalex

+0

Смотрите мой комментарий к другому ответу. Я пишу маршрутизатор, и я ожидаю, что пользователь последует определенным соглашениям. Подобно размещению его контроллеров в «контроллерах/moduleName.js», а затем на основе URL-адреса, я могу вызвать правильный контроллер и метод. – jeffreyveon

+0

Просто попробуйте npm [rainbow] (https://npmjs.org/package/rainbow), который я написал. Это промежуточное ПО маршрутизатора, такое же, как ваше требование для сопоставления URL-адресов для путей к файлам контроллеров. – mytharcher

ответ

3

сделать пользователь вызова функции, которая устанавливает переменные:

myModule.setProps(json) 
    OR 
    myModule = new MyModule(json) 

Затем пользователь может потребовать их корневой конфигурации и инициализации вашего модуля с ним.

Update В ответ на отредактированный вопрос:

Экспресс позволяет определить маршруты, как это:

var routes = require('./routes') 
app.get('/info', routes.info); 

//Routes Module 
exports.info = function(req, res) { 
    res.render('info', {title: 'Express'}) 
}; 

Я считаю, что это именно то, что вы пытаетесь сделать. Это не?

Update 2:

Вы можете найти каталог в настоящее время выполнения сценария заключается в использовании __dirname

console.log(__dirname); 
+0

Я считал это, но у меня также есть еще одна необходимость, когда мне нужно иметь возможность динамически загружать пользовательский модуль (например, при маршрутизации запроса конкретному контроллеру). Есть ли другой способ сделать это?Могу ли я просто предположить, что мой модуль будет в моей папке node_modules/moduleName/lib и просто попытаться относительно получить доступ? – jeffreyveon

+0

Динамически, как в модулях, может измениться во время работы программы? или динамически, так как вы хотите загрузить файлы конфигурации при запуске программы. –

+0

Я уточнил вопрос более подробно. Когда пользователь вводит URL-адрес, мой модуль будет анализировать URL-адрес (на основе, например, rails like convention), и вызывать соответствующий метод модуля контроллера, местоположение которого будет следовать за соглашением. – jeffreyveon

1

У меня такой же вопрос.

И я могу только найти эту переменную окружения справки:

process.env.PWD 

Он всегда указывает на корень вашего пути приложения, где он работает.

+1

Дает мне неопределенное значение ... -1 –

1

Попробуйте это.

var path = require('path'); 
console.log(path.dirname(module.parent.filename));