2013-01-13 11 views
6

ノードjsを初めて使用しています。私は単純なHTTPサーバーを作成しようとしていました。私は有名な例に続き、「Hello World!」を作成しました。サーバーを以下のように設定します。ノードjsサーバーがクラッシュするのを防ぐ方法

var handleRequest = function(req, res) { 
    res.writeHead(200); 
    res1.end('Hello, World!\n'); 
}; 

require('http').createServer(handleRequest).listen(8080); 

console.log('Server started on port 8080'); 

このコードを実行すると、サーバーが正常に起動します。しかし、http://127.0.0.1:8080にアクセスしようとすると、res1が定義されていないというエラーが発生してクラッシュします。私は、サーバがまだ動作し続けていて、エラーが発生したときには正常にエラーを報告したいと思っています。

どのように達成できますか?私はのtry-catchを試してみましたが、それは私を助けていない:(

+2

http://stackoverflow.com/a/8114990/435413(autoreboot javascript)またはhttp://stackoverflow.com/questions/5999373/how-do-i-prevent-node-js-from-crashing- try-catch-doesnt-work(クラッシュを防ぐ) – sod

+1

こんにちはベンジャミン、私は意図的にエラーを生成するためにres1とタイプしました。私の質問は、サーバーをクラッシュせずにそのようなエラーを処理する方法についてです。 – Goje87

答えて

6

ここにはたくさんのコメントがあります。まず、あなたのサンプルサーバーを動作させるには、handleRequestを使用する前に定義する必要があります。終了するプロセスを妨げている、あなたが実際に欲しい

1-、、uncaughtException(documentation)を取り扱うことにより、処理することができるイベント:

var handleRequest = function(req, res) { 
    res.writeHead(200); 
    res1.end('Hello, World!\n'); 
}; 
var server = require('http').createServer(handleRequest); 
process.on('uncaughtException', function(ex) { 
    // do something with exception 
}); 
server.listen(8080); 
console.log('Server started on port 8080'); 

2 - 私は、try {}キャッチ(電子を使用するrecommentう){}あなたのコードで、例えば:私は、例は単なる一例であり、実際のないコードた推測

var handleRequest = function(req, res) { 
    try { 
     res.writeHead(200); 
     res1.end('Hello, World!\n'); 
    } catch(e) { 
     res.writeHead(200); 
     res.end('Boo'); 
    } 
}; 

3-、これを防止することができる解析エラーです。例外キャッチハンドラーで解析エラーが発生しないようにする必要があるので、これについて言及します。

、4-、そのノードprocessはこのようなものを行うよりも、私はむしろexpressのようなフレームワークを使用すると思いdomain

5-将来的に交換する予定ですのでご注意ください。

5,6お薦め講演:私はあなたの質問の詳細が、クラッシュからのノードサーバの防止に関するご質問のタイトルをターゲットにしていないStackOverflow - NodeJS best practice for exception handling

+0

1は間違っていますが、2は非同期コードでは間違っています、プロセスはドメインで補完されるので間違っています、そしてドメインも今でも動作します –

+0

@BenjaminGruenbaum 1なぜですか?さらにそれが実際に動作し、アプリがクラッシュするのを防ぎます+。 2著者は、非同期コードの解析例外を処理する必要があるとは決して言いません。 4ドメインが不安定なバージョンであり、ノードのドキュメントが明示的に「プロセスの代わりにドメインを使用する」 –

+0

ありがとうTom ... ponint 1が私のために働いた...そして私はあなたの提案に従います。私はエクスプレスを使うことを考えます。 – Goje87

0

あなたがそれを使用する前に、たぶん、あなたはhandleRequestを定義する必要があります。

require('http').createServer(handleRequest).listen(8080); 

function handleRequest(req, res) { 
    res.writeHead(200); 
    res1.end('Hello, World!\n'); 
}; 

それとも

var handleRequest = function(req, res) { 
    res.writeHead(200); 
    res1.end('Hello, World!\n'); 
}; 

require('http').createServer(handleRequest).listen(8080); 

そして、あなたがする必要があります res1も存在することを確認してください。

+1

いいえ、javascriptは自動的に "var"ステートメントをスコープの先頭に移動します。 –

+1

こんにちは@NULL、はい... handleRequestはcreateServer行の上にある必要があります。私の悪い。私はそれを間違ってコピー貼り付けました(今質問を更新しています)。さて、res1エラーに来て、私はエラーの原因を知っている。私はそれをうまく扱うことを尋ねようとしていました。 – Goje87

+0

@BenjaminGruenbaumはい 'handleRequest'が定義されていますが、' undefined'です。それは書くのと同じです: 'var a; b(a)a = function(){...} ' – andlrc

1

。おそらくDOMAINを使用することができます。これにより、おそらくuncaughtExceptionがスローされたときにサーバーがクラッシュすることがなくなります。詳細は

domain = require('domain'), 
d = domain.create(); 

d.on('error', function(err) { 
    console.error(err); 
}); 

は、このメソッドのtry-catchしなければならないあなたのブロックを使用して横にhttp://shapeshed.com/uncaught-exceptions-in-node/

を行きます。

関連する問題