2015-03-02 71 views
1
app.get('/:user/:tag', function (req, res) { 
fs.readdir('api'+path.sep+req.params.user, function (err, files) { 
    var tweets=[]; 
    for (var i =1, j=files.length ; i <j; i++) 
    { 
      fs.readFile('api'+path.sep+req.params.user+path.sep+files[i],'utf8', function (err, data) 
      { 
       data=JSON.parse(data); 
       if (data.tag==req.params.tag){tweets.push(data);};   
      }); 
    }; 
    res.send(tweets); 
}); 
}); 

看來問題在於fs方法的回調,但我無法長時間解決它。快速節點服務器返回GET陣列上的空陣列

+1

你的readfile函數是異步的。您應該使用此功能的同步版本。 – 2015-03-02 14:40:21

+1

因爲'fs.readFile'是異步的,所以你有一個競爭條件,這會導致你的'res.send'在任何讀取完成之前被調用。這與你的for循環有同樣的問題。你可能想看看所有的'async'或使用'sync'版本。 – jungy 2015-03-02 14:41:19

+0

謝謝你@ jungy幫助很大! – 2015-03-02 15:00:01

回答

0

是的,fs.readFile()是異步方法,所以你的響應與空的推文。 試試這個代碼

 app.get('/:user/:tag', function (req, res) { 
     fs.readdir('api'+path.sep+req.params.user, function (err, files) { 
if(files.length==0){ 
res.send([]); 
}else{ 
      var tweets=[]; 
      for (var i =0, j=files.length ; i <j; i++) 
      { 
        fs.readFile('api'+path.sep+req.params.user+path.sep+files[i],'utf8', function (err, data) 
        { 
         data=JSON.parse(data); 
         if (data.tag==req.params.tag){tweets.push(data);}; 
         if(i==j-1){ 
          res.send(tweets); 
          }   
        }); 
      }; 
      } 
     }); 
     });