2013-07-11 9 views
18

次のコードは、ブラウザにindex.htmlの内容(テキストのhelloワールドのみを含む)を出力します。しかし、readFileをreadFileSyncに置き換えると、要求がタイムアウトします。私は何が欠けていますか?別のバッファが必要ですか?私は、ノード0.61を使用し、2.4readFileとreadFileSyncの相違点

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

var app = express.createServer(express.logger()); 

app.get('/', function(request, response) { 
    fs.readFile('index.html', function(err, data){ 
     response.send(data.toString()); 
    }); 
}); 

var port = process.env.PORT || 5000; 
app.listen(port, function() { 
    console.log("Listening on " + port); 
}); 
+0

は、あなたが送信し終わったら '.ENDを()'を呼び出すことになっていませんか? NodeJSを使用してからしばらく時間がかかりました。 –

+2

'readFileをreadFileSync'に置き換えるとどういう意味ですか?最初のものはコールバックを必要とし、もう一方はコールバックを必要とします。コードは 'var data = fs.readFileSync( 'index.html');'でなければなりません。 'readFileSync'はそれを使用しないので、コールバックは呼び出されません。それがタイムアウトの原因です。私はそれを正しく理解していると仮定します。 – freakish

+1

@CrazyTrain彼はエクスプレスを使用しています。それはあなたのためにそれを行います。 – freakish

答えて

25

fs.readFileは、あなたが示されているようresponse.sendを呼び出すコールバックを取る表現しています - 良いです。それをfs.readFileSyncに置き換えるだけであれば、コールバックを取らないので、response.sendを呼び出すコールバックは決して呼び出されないので、応答は決して終了せず、タイムアウトになります。

readFileをreadFileSyncに置き換えていない場合は、readFileSyncコードを表示する必要があります。

ノードエクスプレス/ウェブサーバーでreadFileSyncを呼び出す必要があります.I/Oが実行されている間にシングルスレッドループを縛るからです。 I/Oが完了し、コールバック処理コードを実行できるようになるまで、ノードループで他の要求を処理する必要があります。よりよく理解するために

+8

準備が整うまでブロックする必要があるので、サーバーが始動すると、ディスクからSSL証明書をロードするためにreadFileSyncを呼び出すことは問題ありません。しかし、より大きなポイントは完全に正しいです。 – dankohn

+0

@bryanmacありがとうございました。ノード/エクスプレスアプリで使用する機能と使用しない機能の詳細については、どこで知ることができますか? – Ali

+4

規約はすべて非同期であり、例外はxxxSyncという形式を使用します。意識的に同期(起動またはスクリプト)を意味する場合を除き、xxxSyncは避けてください。サーバーは非同期でなければなりません。 – bryanmac

7
'use strict' 
var fs = require("fs"); 

/*** 
* implementation of readFileSync 
*/ 
var data = fs.readFileSync('input.txt'); 
console.log(data.toString()); 
console.log("Program Ended"); 

/*** 
* implementation of readFile 
*/ 
fs.readFile('input.txt', function (err, data) { 
    if (err) return console.error(err); 
    console.log(data.toString()); 
}); 

console.log("Program Ended"); 

上記のコードを実行し、結果を比較する。..