SORU
22 NİSAN 2012, Pazar


Çalışan node.js Bir Uygulama Projesi kök belirlemek

process.cwd() daha iyi bir şekilde çalışıyor node.js bir prosesin kök dizini belirlemek için var mı? Rails.root ama Node.js için eşdeğer gibi bir şey. Mümkün olduğunca öngörülebilir ve güvenilir bir şey arıyorum.

CEVAP
10 EYLÜL 2013, Salı


Bu, kendi artıları ve eksileri ile her yaklaşım için çeşitli yollar vardır:

gerektirir.ana.dosya adı

http://nodejs.org/api/modules.html:

Bir dosya doğrudan Düğümü require.main çalıştırıldığında module onun için ayarlanır. Bir dosya doğrudan require.main === module test ederek çalıştırmak olup olmadığını belirlemek anlamına gelir

module filename bir özellik () __filename normalde eşdeğer sağlar çünkü, mevcut uygulamanın giriş noktası require.main.filename kontrol ederek elde edilebilir.

Eğer uygulamanız için temel dizin istiyorsanız, bunu yapabilirsiniz:

var path = require('path');
var appDir = path.dirname(require.main.filename);

Artıları Ve Eksileri

Bu, çoğu zaman iyi çalışır, ama eğer çalışan iseniz bir başlatıcısı uygulaması gibipm2ya da çalışanmochatestler, bu yöntem başarısız olur.

global.X

Düğüm bir genel ad bir nesne global — bu nesne eklemek için bir şey her yerde uygulaması içinde kullanılabilir çağırdı. Yani, index.js sizin (veya ana uygulama dosyasının adı her neyse app.js ya), sadece global bir 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 Eksileri

Sürekli çalışır, ancak kolayca bileşenleri/vb yeniden kullanabilirsiniz. bu da demek oluyor ki global bir değişken, güvenmek zorunda.

süreç.() basılı belge

Bu, geçerli çalışma dizinini döndürür. İşlemi başlatıldı ne tamamen bağımlı olarak hiç de güvenilir değildirdan:

$ 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

uygulama-kök yol

Bu sorunu gidermek için, düğüm bir modül oluşturdukapp-root-path. Kullanımı çok basittir:

var appRoot = require('app-root-path');
var myModule = require(appRoot   '/lib/my-module.js');

app-root-pathmodül kullanan birkaç farklı teknikler belirlemek için kök yol uygulaması dikkate alınarak, küresel kurulu modülleri (örneğin, app çalışan /var/www/ ama modülü yüklü ~/.nvm/v0.x.x/lib/node/). Zaman 0 işe yaramaz, ama en yaygın senaryolarda işe gidiyor.

Artıları Ve Eksileri

Çoğu durumda, yapılandırma olmadan çalışır. Ayrıca bazı güzel Ek kolaylık yöntemleri (bkz projesi sayfa) sağlar. En büyük dolandırıcı olursa işe yaramaz bu

  • Bir başlatıcısı, pm2 gibi kullanıyorsun
  • VEmodül uygulaması node_modules dizin (örneğin, eğer genel olarak kurduysanız) içine yüklü değil

Sen-ebilmek almak bu da bir ayar APP_ROOT_PATH çevresel değişken veya arama .setPath() Bu modül, ama bu durumda, muhtemelen senden daha iyi kullanma global yöntem.

Çevresel değişken NODE_PATH

Bir yol arıyorsanızbelirlemekgeçerli uygulama, yukarıdaki çözümlerden biri kök yol sizin için en iyi şekilde çalışma olasılığıdır. Diğer taraftan, yükleme uygulaması modülleri sorunu güvenilir bir şekilde çözmek için çalışıyorsanız, ben çok NODE_PATH çevre değişkeni içine bakarak öneririz.

Modules system düğüm yerlerde çeşitli modüllerde arar. One of these locations is wherever process.env.NODE_PATH points. Eğer bu çevre değişkeni ayarlarsanız, herhangi bir değişiklik yapılmadan require standart modül yükleyicisi ile modülleri.

/var/www/lib NODE_PATH ayarlarsanız, örneğin, aşağıdaki sadece iyi çalışır:

require('module2/component.js');
// ^ looks for /var/www/lib/module2/component.js

Bunu yapmak için harika bir yoldur npm kullanarak

"scripts": {
    "start": "NODE_PATH=. node app.js"
}

Şimdi npm start ile uygulamanıza başlayabilirsiniz ve altın. app.js dosyamda: aşağıdaki kod ile bu birleştirin

if (!process.env.NODE_PATH) {
    console.error('NODE_PATH must be set.');
    process.exit(1);
}

...yanlışlıkla NODE_PATH set olmadan uygulama yükleme önler.

Bir tane yakaladım:NODE_PATHGEREKİRayarlanmış olmasıDIŞARIDAdüğüm app. Olamaz modülü önbelleğe uygulamanızı çalıştırmadan önce arar dizin listesi yükleyici çünkü process.env.NODE_PATH = path.resolve(__dirname) gibi bir şey.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Enge

    Eric Enge

    2 Kasım 2009
  • Karan Thakur

    Karan Thakur

    23 HAZİRAN 2010
  • RealPapaPit

    RealPapaPit

    16 Mart 2009