Buna yaklaşmanın birkaç yolu vardır, her birinin kendi artıları ve eksileri vardır:
require.main.filename
Gönderen http://nodejs.org/api/modules.html :
Bir dosya doğrudan Düğümden çalıştırıldığında, require.mainonun olarak ayarlanır module. Bu, bir dosyanın test edilerek doğrudan çalıştırılıp çalıştırılmadığını belirleyebileceğiniz anlamına gelirrequire.main === module
Çünkü modulebir sağlar filenameözelliği (normal eşdeğer __filename), o andaki uygulamanın giriş noktası kontrol edilmesiyle elde edilebilir require.main.filename.
Uygulamanız için temel dizini istiyorsanız, şunları yapabilirsiniz:
var path = require('path');
var appDir = path.dirname(require.main.filename);
Artılar ve eksiler
Bu çoğu zaman harika sonuç verir, ancak uygulamanızı pm2 gibi bir başlatıcıyla çalıştırıyorsanız veya mocha testleri çalıştırıyorsanız , bu yöntem başarısız olur.
global.X
Düğüm adında genel bir ad alanı nesnesi vardır global- bu nesneye eklediğiniz her şey uygulamanızın her yerinde kullanılabilir olacaktır. Bu nedenle, index.js(veya app.jsana uygulama dosyanızın adı ne olursa olsun) bir global değişken tanımlayabilirsiniz:
// index.js
var path = require('path');
global.appRoot = path.resolve(__dirname);
// lib/moduleA/component1.js
require(appRoot + '/lib/moduleB/component2.js');
Artılar ve eksiler
Tutarlı bir şekilde çalışır ancak global bir değişkene güvenmeniz gerekir, bu da bileşenleri / vb. Kolayca yeniden kullanamayacağınız anlamına gelir.
process.cwd ()
Bu, geçerli çalışma dizinini döndürür. O süreç başlatıldı hangi dizin tamamen bağlıdır yöntem olduğu hiç değil güvenilir dan :
$ cd /home/demo/
$ mkdir subdir
$ echo "console.log(process.cwd());" > subdir/demo.js
$ node subdir/demo.js
/home/demo
$ cd subdir
$ node demo.js
/home/demo/subdir
app-kök-yolu
Bu sorunu çözmek için app-root-path adlı bir düğüm modülü oluşturdum . Kullanımı basit:
var appRoot = require('app-root-path');
var myModule = require(appRoot + '/lib/my-module.js');
App-kök yolu modülü uygulama içinde çalışıyorsa, örneğin (hesaba küresel yüklü modülleri alarak uygulamanın kök yolunu belirlemek için birkaç farklı teknikler kullanan /var/www/ancak modül yüklü~/.nvm/v0.x.x/lib/node/ ). Zamanın% 100'ü çalışmaz, ancak çoğu yaygın senaryoda çalışacaktır.
Artılar ve eksiler
Çoğu durumda konfigürasyon olmadan çalışır. Ayrıca bazı hoş ek kolaylık yöntemleri sağlar (proje sayfasına bakınız). En büyük con, şu durumlarda işe yaramayacağıdır:
- PM2 gibi bir başlatıcı kullanıyorsunuz
- VE , modül uygulamanızın
node_modulesdizinine yüklenmez (örneğin, global olarak yüklediyseniz)
APP_ROOT_PATHÇevresel bir değişken belirleyerek veya .setPath()modülü arayarak bu sorunu çözebilirsiniz , ancak bu durumda, muhtemelenglobal yöntemi .
NODE_PATH çevresel değişken
Mevcut uygulamanın kök yolunu belirlemenin bir yolunu arıyorsanız , yukarıdaki çözümlerden birinin sizin için en iyi sonucu vermesi muhtemeldir. Öte yandan, uygulama modüllerini güvenilir bir şekilde yükleme sorununu çözmeye çalışıyorsanız, NODE_PATHçevresel değişkene bakmanızı şiddetle tavsiye ederim .
Düğümün Modüller sistemi çeşitli konumlardaki modülleri arar. Bu konumlardan biri nereye process.env.NODE_PATHişaret ediyorsa odur . Bu çevresel değişkeni ayarlarsanız require, standart modül yükleyicili modülleri başka bir değişiklik yapmadan yapabilirsiniz.
Örneğin, ayarlarsanız NODE_PATHiçin /var/www/libaşağıdaki iyi çalışacak:
require('module2/component.js');
// ^ looks for /var/www/lib/module2/component.js
Bunu yapmanın harika bir yolu npm:
"scripts": {
"start": "NODE_PATH=. node app.js"
}
Şimdi uygulamanızı başlatabilirsiniz npm startve siz de altınsınız. Bunu , uygulama ayarlanmadan yanlışlıkla yüklenmesini önleyen zorlama düğümü yol modülümle birleştiriyorum NODE_PATH. Çevresel değişkenlerin uygulanması üzerinde daha fazla kontrol için bkz. Checkenv .
Bir yakaladım: NODE_PATH zorundadır set olmak dışında düğümü uygulamasının. Gibi bir şey yapamazsınprocess.env.NODE_PATH = path.resolve(__dirname)Modül yükleyici, uygulamanız çalışmadan önce arayacağı dizinlerin listesini önbelleğe aldığı için .
[eklenen 4/6/16] Bu sorunu çözmeye çalışan gerçekten umut vaat eden başka bir modül dalgalı .