2016-06-15 7 views
0

にもかかわらず、私はこのコードのシンプルな作品を持っています"console.log(cont)"のように:のNode.jsは、明示的なreturn文

fs.readFile('.' + p,'utf8', function (err, cont) { 
     console.log(html) 
     if (err) return "EERRRORRRRR"; 
     else return cont; 
    }) 

;正しい内容を記録するので、なぜ関数は未定義に戻っていますか?内容は存在します...

どうすればこの問題を解決できますか?

コードの本来のコンテキストは、わからない場合は単純なWebサーバーでした。

答えて

0

readFile(node.js内)はasync(他のほとんどの機能と同様)です。あなたが代わりに、あなたは操作が終了した後に呼び出されるコールバック関数を使用する必要があり、非同期関数から値を返すことはできません。

fs.readFile('.' + p,'utf8', function (err, cont) { 
      console.log(html) 
      if (err) return "EERRRORRRRR"; 
      else handleResponse(cont); 
     }) 

function handleResponse(data){//Do something here} 
1

読むコールバックや非同期機能については、Google

でドキュメントを見つけることができます
var http = require('http'), 
    fs = require("fs"); 

// notice new parameter callback 
function get(p, callback) { 
    fs.readFile('.' + p,'utf8', callback); 
} 

http.createServer(function (request, response) { 
    var path = ((request.url==="/")?"/index.html":request.url); 

    // get accepts callback 
    get(path, function(err, data){ 
     if(err){ 
      response.send('not found'); 
     } else { 
      response.send(data); 
     } 
    }); 
}).listen(80); // notice: port 80 requires sudo to run, use better 3000 
+0

ありがとうございます!私はさらにコールバック構造体にする –

+0

ステータスを使用してメソッドを送信する利点は何ですか?彼らは私のアプリケーションでは動作しませんので、私はちょうど終了を使用しました... –

+0

@WorstForumええ、彼らはあなた次第です。ステータスはrest-apisです –

0

コールバックを使用せずに何かを返すには、readFileSyncを使用してください。

function get(p) { 
    var file = fs.readFileSync('.' + p,'utf8'); 
    return file ? file : "EERRRORRRRR"; 
} 

これは、同期/ブロッキングコードの使用を気にしないことを前提としています。

+0

ありがとう、最も簡単な修正ですが、私は両方の方法を検討します。 –

関連する問題