2011-08-08 58 views
0

我敢肯定,這只是一個簡單的Javascript範圍問題(去圖),但我已經嘗試了幾種不同的方式,似乎無法得到這個工作。可變的HTTP/HTTPS快速服務器

的想法是,在Express.js服務器默認HTTP與呼叫到express.createServer(),但任選地在檢測到的./conf/cert.pem./conf/key切換到HTTPS .pem。我正在使用異步調用Node的path.exists(),由此第二個回調參數包含布爾結果。

我把它們嵌套在當前,這樣HTTPS服務器纔會被創建,直到它「安全」(我們知道兩個文件是否存在的結果),因爲否則就不保證排序。但是,正如我所提到的,我嘗試了幾種不同的方式,但我似乎無法修改變量的外部應用程序變量。

我確定有一個簡單的修復程序,我現在沒有看到,但任何幫助將不勝感激!

app = module.exports = express.createServer(); 

path.exists('./conf/key.pem', function(exists){ 
    var keyExists = exists; 
    path.exists('./conf/cert.pem', function(exists) { 
     var certExists = exists; 
     if (keyExists && certExists) { 
      app = express.createServer({ 
       key: fs.readFileSync('./conf/key.pem'), 
       cert: fs.readFileSync('./conf/cert.pem') 
       }); 
     } 
    }); 
}); 

回答

3

這並不理想。您不應僅創建常規http服務器才能使其被HTTPS服務器覆蓋。我認爲你提到的問題來自於你設置了app變量,但不是module.exports。因此module.exports仍然指創建的原始服務器。這是你應該做的:

var app = express.createServer({ 
    key: fs.readFileSync('./conf/key.pem'), 
    cert: fs.readFileSync('./conf/cert.pem') 
}); 
module.exports = app; 

沒有理由檢查文件是否先存在。如果文件不存在,readFileSync將會拋出一個ENOENT。甚至在進入事件循環之前,也沒有理由異步執行任何操作。

我不知道你爲什麼會想你的服務器有條件地爲https,但這樣做類似的東西給你試圖做有:

var app; 
try { 
    app = express.createServer({ 
    key: fs.readFileSync('./conf/key.pem'), 
    cert: fs.readFileSync('./conf/cert.pem') 
    }); 
} catch(e) { 
    if (e.code !== 'ENOENT') throw e; 
    app = express.createServer(); 
} 
module.exports = app; 

或者,這可能看起來更好:

var app; 
if (path.existsSync('./conf/key.pem')) { 
    app = express.createServer({ 
    key: fs.readFileSync('./conf/key.pem'), 
    cert: fs.readFileSync('./conf/cert.pem') 
    }); 
} else { 
    app = express.createServer(); 
} 
module.exports = app; 

請記住,只要您不必同時提供100萬個請求,同步處理就可以了。

+0

感謝您指出path.existsSync()方法!實際上,我正在查看舊版本的文檔(源於我懶惰,谷歌搜索鏈接,而不是導航到Node主頁:D),它沒有同步版本。它確實讓事情變得更簡單!儘管現在代碼當然更清潔/更少危險,但我仍然有相同的範圍問題。即使在* module.exports = app *之後,應用程序在下載到* configure *塊時也是未定義的。 –

+0

**更新**:找出來。非常好,謝謝!爲了解決以前的注意事項,運行HTTPS服務器取決於之前生成的證書。雖然我打算在將來實現一切自動化的構建過程,但我在此期間避開了依賴關係。此外,儘管我大多數情況下都是通過HTTPS進行操作的,但我不希望終端用戶無法使用普通的HTTP(如果需要的話)。最終我會創建一些配置文件來指定明確的選擇。 –