492 votes

Déterminer la racine du projet à partir d'une application node.js en cours d'exécution

Y a-t-il un autre moyen, autre que process.cwd() pour obtenir le nom du chemin du répertoire racine du projet en cours. Est-ce que Node implémente quelque chose comme la propriété de Ruby, Rails.root ,. Je cherche quelque chose qui soit constant et fiable.

1voto

Julien Points 15

Cela va descendre dans l'arborescence du répertoire jusqu'à ce qu'il contienne un fichier node_modules qui indique généralement le répertoire Root de votre projet :

const fs = require('fs')
const path = require('path')

function getProjectRoot(currentDir = __dirname.split(path.sep)) {
  if (!currentDir.length) {
    throw Error('Could not find project root.')
  }
  const nodeModulesPath = currentDir.concat(['node_modules']).join(path.sep)
  if (fs.existsSync(nodeModulesPath) && !currentDir.includes('node_modules')) {
    return currentDir.join(path.sep)
  }
  return this.getProjectRoot(currentDir.slice(0, -1))
}

Il s'assure également qu'il n'y a pas node_modules dans le chemin d'accès renvoyé, car cela signifie qu'il est contenu dans un paquet d'installation imbriqué.

0voto

Karthik M Points 452

Créer une fonction dans app.js

/*Function to get the app root folder*/

var appRootFolder = function(dir,level){
    var arr = dir.split('\\');
    arr.splice(arr.length - level,level);
    var rootFolder = arr.join('\\');
    return rootFolder;
}

// view engine setup
app.set('views', path.join(appRootFolder(__dirname,1),'views'));

0voto

vbranden Points 2710

J'utilise ceci.

Pour mon module nommé mymodule

var BASE_DIR = __dirname.replace(/^(.*\/mymodule)(.*)$/, '$1')

0voto

Pulkit Aggarwal Points 1041

Vous pouvez simplement ajouter le chemin du répertoire racine dans la variable express app et obtenir ce chemin de l'application. Pour cela, ajoutez app.set('rootDirectory', __dirname); dans votre fichier index.js ou app.js. Et utilisez req.app.get('rootDirectory') pour obtenir le chemin du répertoire racine dans votre code.

0voto

Erwinus Points 1587

Vieille question, je sais, mais aucune question ne mentionne d'utiliser progress.argv . Le tableau argv comprend un chemin d'accès complet et un nom de fichier (avec ou sans extension .js) qui a été utilisé comme paramètre pour être exécuté par node. Comme il peut également contenir des drapeaux, vous devez le filtrer.

Ce n'est pas un exemple que vous pouvez utiliser directement (parce que j'utilise mon propre cadre) mais je pense que cela vous donne une idée de la façon de procéder. J'utilise également une méthode de cache pour éviter que l'appel de cette fonction ne stresse trop le système, notamment lorsqu'aucune extension n'est spécifiée (et qu'une vérification de l'existence du fichier est nécessaire), par exemple :

node myfile

ou

node myfile.js

C'est la raison pour laquelle je le mets en cache, voir aussi le code ci-dessous.


function getRootFilePath()
{
        if( !isDefined( oData.SU_ROOT_FILE_PATH ) )
        {
            var sExt = false;

            each( process.argv, function( i, v )
            {
                 // Skip invalid and provided command line options
                if( !!v && isValidString( v ) && v[0] !== '-' )
                {
                    sExt = getFileExt( v );

                    if( ( sExt === 'js' ) || ( sExt === '' && fileExists( v+'.js' )) )
                    {

                        var a = uniformPath( v ).split("/"); 

                         // Chop off last string, filename
                        a[a.length-1]='';

                         // Cache it so we don't have to do it again.
                        oData.SU_ROOT_FILE_PATH=a.join("/"); 

                         // Found, skip loop
                        return true;
                    }
                }
            }, true ); // <-- true is: each in reverse order
        }

        return oData.SU_ROOT_FILE_PATH || '';
    }
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X