2012-02-11 8 views
-1

node.jsでノンブロッキングアプリケーションを作成する方法を学習しようとしていますが、コードが動作していないようです。Node.jsのノンブロッキングコードが動作しない

nonblocking.js

var http = require('http'); 
var exec = require('child_process').exec; 

var userRequests = 0; 
http.createServer(function (request, response) { 
    userRequests++; 

    response.writeHead(200, {'Content-Type': 'text/plain'}); 

    if(userRequests == 1){ 
     exec("node wait.js", function(){ 
      response.write('Thanks for waiting!'); 
      response.end(); 
     }); 
    } 
    else{ 
     response.write('Hello!'); 
     response.end(); 
    } 
}).listen(8080); 

console.log('Server start'); 

wait.js定義により

var startTime = new Date().getTime(); 
while (new Date().getTime() < startTime + 15000); 
+0

あなたは何をしようとしていますか? settimeoutではなく、新しいプロセスを生成するポイントは何ですか?正確に「働いていない」とは何ですか?ノードはデフォルトでは非ブロッキングですが、ブロックするためには、ほとんどが一層厳しく作業する必要があります。 – mna

+0

wait.jsが大きなファイルなどを読んでいるように見せかけます。 私はこのプロセスを新しいプロセスで実行しなかった場合、ファイルを読み込んでいる間に他の受信要求をブロックすることになります。 – Undefined

答えて

2

、あなたの例では、ロジックをブロックが含まれます。ブロックしている主なプロセスではないかもしれませんが、それでも目的を破ることはあります。

ノードは、ブラウザのJavaScriptと同様にイベントループを使用します。 JavaScriptがどのように動作するかを学ぶために、ネット上にたくさんのリソースがあります。

私はあなたがこれらを見てお勧めします:

キーポイントは、ノード内のすべてが何らかのイベントによってトリガーされていることです。投稿したサンプルコードでは、そのイベントは生成されたプロセスが終了しています。しかし、15秒待つために別のプロセスを開始する必要はありません。 ノードのAPIであるはすべてイベント駆動型であり、時間ベースのイベントは実際にはJavaScript自体の一部です。ここで

はあなたの例のようなものを書くだろうかの例です:

var http = require('http'), 
    userRequests = 0; 

http.createServer(function (request, response) { 
    userRequests++; 

    response.writeHead(200, {'Content-Type': 'text/plain'}); 

    if(userRequests == 1){ 
    setTimeout(function(){ 
     response.write('Thanks for waiting!'); 
     response.end(); 
    }, 15000); 
    } 
    else{ 
    response.write('Hello!'); 
    response.end(); 
    } 
}).listen(8080, function() { 
    console.log('Server start'); 
}); 

あなたのコメントでファイルを述べました。ファイルを送信するには、これを行うだろう。一般的には

var http = require('http'), 
    exec = require('child_process').exec, 
    userRequests = 0; 

http.createServer(function (request, response) { 
    userRequests++; 

    response.writeHead(200, {'Content-Type': 'text/plain'}); 

    if(userRequests == 1){ 
    var stream = fs.createReadStream('./somefile.txt'); 
    stream.on('data', function(data) { 
     response.write(data); 
    }); 
    stream.on('end', function() { 
     response.end(); 
    }); 
    } 
    else{ 
    response.write('Hello!'); 
    response.end(); 
    } 
}).listen(8080, function() { 
    console.log('Server start'); 
}); 

、あなたの代わりにこれを行うだろうので、それが実際にはもっと簡単です:

if(userRequests == 1){ 
    fs.createReadStream('./somefile.txt').pipe(response); 
} 

ノードがデータを発する「ストリーム」の標準的な定義を持っていますそして終わりの出来事の中で、そして 'pipe'メソッドは、上記の例で手動で追加したデータハンドラとイベントハンドラのバインドを自動的に処理します。

私が言ったように、それらの記事を読んで始めてください。彼らは非常に便利で、正しい方向に向かうことができます。