2011-08-08 5 views
0

私は、これは単純なJavascriptのスコープの問題(図に行く)であると確信しているが、私はいくつかの異なる方法を試してみたし、これが動作するように見えることはできません。HTTP/HTTPS可変エクスプレスサーバ

アイデアはexpress.createServer()を呼び出してHTTPにExpress.jsサーバのデフォルトは、しかし任意./conf/cert.pem./conf/keyの検出時にHTTPSに切り替えることです.pem。私は2番目のコールバック引数はブール値の結果が含まれていることにより、ノードのpath.existsへの非同期呼び出し()を使用しています。

私は順序がそうでない場合は保証されませんので、それは(私たちは2つのファイルが存在するか否かの結果を知る)「安全」になるまで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; 

は同期のことをやってする限り、あなたは同時に万件のリクエストを処理する必要がないようで結構です、覚えておいてください。

+0

path.existsSync()メソッドを指摘してくれてありがとう!私は実際に古いバージョンのドキュメントを見ていました(私が怠け者であり、ノードのホームページに移動するのではなく、リンクのためにグーグルを探していました:D)。確かに物事が楽になる!コードは現在、よりクリーンで危険性は低いですが、私はまだ同じスコープの問題を抱えています。 * module.exports = app *の後でさえ、appは* configure *ブロックに到達すると未定義です。 –

+0

**アップデート**:それを考え出しました。今、素晴らしい作品、ありがとう!また、以前のメモに対処するために、HTTPSサーバーの実行は以前に生成された証明書によって異なります。私はすべてを自動化するビルドプロセスを将来作成しようとしていますが、その間に依存関係を回避しています。さらに、私はHTTPS上で動作するほとんどのインスタンスを描いていますが、必要に応じて通常のHTTPを使用できないようにエンドユーザーを夢中にしたくありません。最終的には、明示的な選択を指定するための設定ファイルをいくつか作成します。 –

関連する問題