0

node'js プロセスを呼び出して、twitter をスクレイピングし、データからグラフを作成しています...

これがコードです。

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);

それはすべてハンキードーリーです...

今、私はこれを次のように呼び出します:

$.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 呼び出しにデータが返されることは確実です。

4

1 に答える 1

1

サーバーは新しく作成されたグラフィック ファイルのコンテンツを配信していますが、クライアントが行っていることはすべて、コンテンツを JSON であるかのように解析し (明らかにそうではないため、エラー メッセージが表示されます)、<img>要素を挿入することです。ブラウザは、元の HTML を配信したサーバーから「filenamegraph.png」を要求します。

AJAX リクエストをまったく行う必要がないように思えます。追加するだけ<img src='http://eavesdropper.dev:1337/?your_params' />で、ブラウザはサーバーから生成された画像を自動的に取得して表示します。

于 2012-07-13T23:02:43.787 に答える