2012-07-13 49 views
0

我打電話給一個node'js進程來刮開twitter並從數據創建圖表...來自節點的ajax響應

這裏是代碼。

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

var filepath = 'filenamegraph.png'; 

http.createServer(function(req,res){ 
    var urlstr = url.parse(req.url,true); 
    var twit = exec("php -f twitter-scraper.php "+urlstr.query.term ,function(error, stdout, stderr){ 
     var graphstring = stdout; 
     var stream = fs.createWriteStream("graph.txt"); 
     stream.once('open', function(fd){ 
      stream.write(graphstring, function(){ 
       exec('dot -T png -o filenamegraph.png graph.txt', function(){ 
        fs.stat(filepath,function(err,stat){ 
         res.writeHead(200,{'Content-Type':'image/png', 'Content-Length': stat.size }); 
         fs.readFile(filepath,function(err,file_conts){ 
          res.write(file_conts); 
          res.end(); 
         }); 
        }); 
       }); 
      }); 
     }); 
    }); 
}).listen(1337); 

所有這就是是虎背熊腰,腳蹬dory的...

現在我把這個用:

$.ajax({ 
    url: 'http://eavesdropper.dev:1337', 
    data: { term : $.url.parse().params.term }, 
    success: function(data) { 
     var res = $.parseJSON(data); 
     console.log(res); 
     $("body").append('<img src="filenamegraph.png" />'); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     console.log(jqXHR,'errror - ' + textStatus + " - " + errorThrown + ' ||'); 
    }, 
    complete: function(jqXHR, textStatus){ 
     console.log(jqXHR, textStatus) 
    } 
}); 

幕後的工作是不錯,但我得到這個...

Object { readyState=0, status=0, statusText="error"} error - error - || 

不知道下一步是什麼,所以任何提示非常感謝。

PS:直接在瀏覽器中運行,腳本正確地生成圖表,所以這確實是數據被返回到正在變得沮喪的ajax調用。

回答

1

您的服務器正在傳遞新創建的圖形文件的內容,但您的所有客戶端正在嘗試解析內容,就好像它是JSON(它顯然不是,導致您的錯誤消息),然後插入<img>元素,該元素將導致瀏覽器從任何提供原始HTML的服務器請求「filenamegraph.png」。

在我看來,你根本不需要做AJAX請求;只需追加<img src='http://eavesdropper.dev:1337/?your_params' />,瀏覽器將自動從服務器獲取並顯示生成的圖像。

+0

是的。我發佈後意識到,但你是正確的 - 服務器將返回一個圖像。 ajax請求非常重要,因爲這是一個大型信息系統的組件,所有這些都需要進行更新。看着只接受原始圖像數據的ajax請求。 – 2012-07-14 21:21:25