2012-04-09 19 views
31

Ters bir proxy uygulamasının arkasına sahip bir uygulamam var, bunun yalnızca localhost/127.0.0.1 dinlemesini istiyorum. Node.JS Express, yalnızca localhost'ta nasıl dinlenir?

Ben bu işe beklenen:

app.listen(3001, 'localhost');

veya

app.listen(3001, '127.0.0.1');

... fakat bunun yerine bir hata alıyorum:

node.js:201 
    throw e; // process.nextTick error, or 'error' event on first tick 
     ^
TypeError: Cannot read property 'port' of null 
    at Object.<anonymous> (/home/ctoledo/hive-go/go.js:204:76) 
    at Module._compile (module.js:441:26) 
    at Object..js (module.js:459:10) 
    at Module.load (module.js:348:31) 
    at Function._load (module.js:308:12) 
    at Array.0 (module.js:479:10) 
    at EventEmitter._tickCallback (node.js:192:40) 

uygulamayı olmadan Koşu bir belirtme hostname iyi çalışır, yani, app.listen(3001);.

Ben Düğüm v0.6.14 çalışan ve 2.5.5 @ ifade etmek ve bu google groups discussion okudum ve Express'te this comment diyerek application.js bulduk ediyorum: "Bu yöntem düğüm en http.Server#listen() aynı argüman alır"

Yardımlarınız için teşekkür ederiz.

+0

Hatanın yığın izini verebilir misiniz? Sadece metni vermek çok işe yaramıyor. – loganfsmyth

+0

Düzenlenen soru – nak

+0

'204' satırında' go.js' dosyasındaki bir hata. Bu çizgi ne yapıyor? Biraz daha kod yazabilir misin? Github üzerinde – loganfsmyth

cevap

34

Bilgi için teşekkürler, sorunu görüyorum. Bu, yalnızca bir ana makine eklediğinizde görünen hive-go numaralı hatadır. bunun son satırlar şunlardır:

app.listen(3001); 
console.log("... port %d in %s mode", app.address().port, app.settings.env); 

ilk satırında ana eklediğinizde app.address().port çağırdığında, bu çöküyor.

Sorun, .listen()'un potansiyel olarak eşzamansız yapısıdır. Gerçekten, bir geri aramada dinlemek için console.log çağrısını yapmalı. Ana bilgisayarı eklediğinizde, bir DNS araması yapmaya çalışır, bu da eşzamansızdır. Dolayısıyla, bu adres adresi almaya çalıştığında, henüz bir DNS isteği çalıştığı için yok, dolayısıyla çöküyor.

bu deneyin: Eğer bağlantı sunulmadan önce() app.address log avutmaya çalışıyorsunuz çünkü

app.listen(3001, 'localhost', function() { 
    console.log("... port %d in %s mode", app.address().port, app.settings.env); 
}); 
+0

Teşekkürler, ben konsol.log yorumladı ... async uyarısı sadece bana gerçekleşmedi, şerefe! – nak

21

bu sorunu yaşıyoruz. Bağlantı yapıldıktan sonra, yani geri aramada veya bağlantının yapıldığını belirten bir olaydan sonra konsolu kaydetmeye karar verdiğinizden emin olmalısınız.

var express = require('express'); 
var http = require('http'); 

var app = express(); 
var server = http.createServer(app); 

app.get('/', function(req, res) { 
    res.send("Hello World!"); 
}); 

server.listen(3000, 'localhost'); 
server.on('listening', function() { 
    console.log('Express server started on port %s at %s', server.address().port, server.address().address); 
}); 

Bu nodejs v0.6 + ve Ekspres v3.0 + 'da gayet güzel çalışıyor: bağlantı kurulduktan sonra bu yüzden sadece bunu

Neyse ki, 'dinleme' olay sunucusu tarafından yayılır.

İlgili konular