2011-11-14 6 views
1

Je développe un paquetage NPM, qui nécessite un module de la racine de l'application. Pensez-y comme le paquet nécessitant un module de propriétés, qui est placé dans la racine de l'application par l'utilisateur.NPM - chemin vers la racine de l'application

Comment obtenir le chemin d'accès à la racine de l'application?

MISE À JOUR:

Pour résumer ce que je suis en train de faire, express vous permet de faire quelque chose comme ceci:

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

La fonction routeur se app comme paramètre. L'idée est de permettre aux utilisateurs de spécifier les routes dans un fichier séparé, et ils ont juste besoin de suivre certaines conventions comme mettre leurs contrôleurs dans le dossier /controllers, et mon module sera en mesure d'analyser dynamiquement le chemin, puis d'invoquer la bonne méthode dans le bon module. Je l'ai déjà fait fonctionner, mais je me suis rendu compte que si je l'empaquais dans NPM, je n'ai plus accès au chemin de l'application, donc je ne peux pas invoquer dynamiquement la méthode d'un module de contrôleur.

+0

Vous ne devriez pas faire cela, faites plutôt appeler l'utilisateur par le "constructeur" (ou toute autre fonction que vous avez) avec les propriétés. – alessioalex

+0

Voir mon commentaire sur l'autre réponse. J'écris un routeur, et je m'attends à ce que l'utilisateur suive certaines conventions. Comme mettre ses contrôleurs dans "controllers/moduleName.js" - et ensuite basé sur l'URL, je serai en mesure d'invoquer le contrôleur et la méthode corrects. – jeffreyveon

+0

Juste essayer le npm [arc-en-ciel] (https://npmjs.org/package/rainbow) que j'ai écrit. C'est un middleware de routeur identique à votre exigence pour mapper l'URL aux chemins de fichiers des contrôleurs. – mytharcher

Répondre

3

Faire l'utilisateur appelle une fonction qui définit les variables:

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

Ensuite, l'utilisateur peut exiger leur configuration racine et init votre module avec elle.

mise à jour En réponse à la question modifiée:

Express permet de définir des itinéraires comme ceci:

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

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

Je crois que c'est exactement ce que vous essayez de faire. N'est-ce pas?

Mise à jour 2:

Vous pouvez trouver le répertoire du script en cours d'exécution est à utiliser je même question __dirname

console.log(__dirname); 
+0

J'ai considéré cela, mais j'ai aussi un autre besoin où je dois être capable de charger dynamiquement un module utilisateur (par exemple lors du routage d'une requête vers un contrôleur spécifique). Y a-t-un autre moyen de faire ça?Est-ce que je peux juste supposer que mon module sera dans mon dossier node_modules/moduleName/lib, et essaye juste d'accéder relativement? – jeffreyveon

+0

Dynamiquement comme dans les modules peuvent changer pendant que le programme est en cours d'exécution? ou Dynamiquement comme vous voulez charger dans les fichiers de configuration lorsque le programme démarre. –

+0

J'ai mis à jour la question avec plus de détails. Lorsque l'utilisateur entre une URL, mon module va analyser l'URL (sur la base de dire, rails comme convention) et invoquer la méthode appropriée d'un module de contrôleur, dont l'emplacement suivra une convention. – jeffreyveon

1

.

Et je ne peux trouver cet environnement aide variable:

process.env.PWD 

Il serait toujours pointer vers la racine de votre chemin de l'application en cours d'exécution où il.

+1

Me donne une valeur indéfinie ... -1 –

1

Essayez ceci.

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