2016-04-04 16 views
0

TwitterのAPIを照会する2つの関数があります。クエリはWebインターフェイスを介して行われ、チェックボックスがオンの場合は各関数を呼び出します。私の問題は、すべてのクエリが完了した後です。データを保存してWebインターフェイスに戻したいと思っています。これはどうすればいいですか?Node.jsコールバックを使用してWebインターフェイスにデータを送信する方法

if (string.checktweet1 == 'on') { 
     tweets(string.teamname) 
    } 
    if (string.checkmentions1 == 'on'){ 
     mentions(string.teamname) 
    } 
    if (string.checktweet2 == 'on'){ 
     tweets(string.playername) 
    } 

    if (string.checkmentions2 == 'on'){ 
     mentions(string.playername) 
    } 

 function mentions(x){ 
     client.get('search/tweets', {q:x, count:1}, 
     function (err,data,){ 
      for(var index in data.statuses){ 
       var tweet = data.statuses[index]; 
       console.log(tweet.text); 
      } 
     }) 
    } 

マイコードのみがデータベースなしでファイルにデータを保存するための「つぶやき」

 json = {}; 
    function tweets(y){ 
     client.get('statuses/user_timeline', {screen_name:y, count:1}, 
     function(err,data) { 
     for(var index in data){ 
      var tweet = data[index]; 
      console.log(tweet.text); 
     } 
      json[index] = tweet 
      res.end(JSON.stringify(json)); 
     }) 
    } 
+0

これはサーバーのサイドコードですか?データベースを使用していますか?あなたはdevの目的のために 'JSON'ファイルから読み書きできます – cl3m

+0

@ cl3mこれはサーバー側のコードです。私はデータベースを使用していません。 TwitterのAPIから受け取ったデータを自分のウェブインターフェースに直接送りたいだけです –

+0

ウェブインターフェースからどのようにあなたのサーバーコードを呼び出すのですか?あなたは何らかのAjaxコールを使用していますか? – cl3m

答えて

0

機能のためのデータを送信していますが、あなたはfs.writeFileを使用することができます():

fs.writeFile('message.txt', 'Hello Node.js', (err) => { 
    if (err) throw err; 
    console.log('It\'s saved!'); 
}); 

https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback

サーバー/ノード:私はあなたが理解したよう

var app = require('http').createServer(handler) 
var io = require('socket.io')(app); 
var fs = require('fs'); 

app.listen(80); 

function handler (req, res) { 
    fs.readFile(__dirname + '/index.html', 
    function (err, data) { 
    if (err) { 
     res.writeHead(500); 
     return res.end('Error loading index.html'); 
    } 

    res.writeHead(200); 
    res.end(data); 
    }); 
} 

io.on('connection', function (socket) { 
    if(twitterInfoReady){ 
     socket.emit('twitterInfoIncoming', { 
      twitterInfo1: 'blah', 
      twitterInfo2: 'more data', 
      twitterInfo3: 'and more data' 
     }); 
    } 
}); 

クライアントSocket.ioドキュメントから取ら

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io('http://localhost'); 
    socket.on('twitterInfoIncoming', function (data) { 
    console.log(data.twitterInfo1); 
    }); 
</script> 

例は、ほんの少しhttp://socket.io/docs/

1

を修正しますデータを保存するのではなく、複数の非同期呼び出しの結果を収集するだけですすべてが完了してクライアントにデータを配信しますか?その場合は、asyncまたはpromisesを使用できます。

スタックオーバーフローでこれの例が既にあります。このNode.js: Best way to perform multiple async operations, then do something else?が、ここでは両方ともそのための実装が簡略化されています。私はあなたが使用しているHTTPクライアントわかりませんが、あなたはおそらく返すようにメソッドを変換するvar client = Promise.promisifyAll(require('your-client-lib'));を使用することができ、非同期約束

var Promise = require('bluebird'); 

// ... 

var tweets = function(y) { 
    return new Promise(function(resolve, reject) { 
    client.get('statuses/user_timeline', {screen_name: y, count: 1}, 
     function(err, data) { 
     // Process the data ... 
     resolve(processedTweets); 
     } 
    ); 
    }); 
}; 

var mentions = function(x) { 
    return new Promise(function(resolve, reject) { 
    client.get('search/tweets', {q: x , count: 1}, 
     function(err, data) { 
     // Process the data ... 
     resolve(processedMentions); 
     } 
    ); 
    }); 
}; 

app.get('/mytweetsapi', function(req, res) { 
    var tasks = []; 
    // Same if this then tasks.push as in async example here 

    Promse.all(tasks).then(function(results) { 
    // Process the results array ... 
    res.json(processedResults); 
    }); 
}); 

を使用して

var async = require('async'); 

// ... 

var tweets = function(y) { 
    return function(cb) { 
    client.get('statuses/user_timeline', {screen_name: y, count: 1}, 
     function(err, data) { 
     // Process the data ... 
     cb(null, processedTweets); 
     } 
    ); 
    } 
}; 

var mentions = function(x) { 
    return function(cb) { 
    client.get('search/tweets', {q: x , count: 1}, 
     function(err, data) { 
     // Process the data ... 
     cb(null, processedMentions); 
     } 
    ); 
    } 
}; 

app.get('/mytweetsapi', function(req, res) { 
    var tasks = []; 
    if (string.checktweet1 == 'on') { 
    tasks.push(tweets(string.teamname)); 
    } 
    if (string.checkmentions1 == 'on'){ 
    tasks.push(mentions(string.teamname)); 
    } 
    if (string.checktweet2 == 'on'){ 
    tasks.put(tweets(string.playername)); 
    } 
    if (string.checkmentions2 == 'on'){ 
    tasks.put(mentions(string.playername)); 
    } 

    async.parallel(tasks, function(err, results) { 
    // Process the results array ... 
    res.json(processedResults); 
    }); 
}); 

を使用して

約束してから、tweetsmentions関数を

に変換することができます
var tweets = function(y) { 
    return client.get('statuses/user_timeline', {screen_name: y, count: 1}); 
}; 

Promise.allresultsしかしこの方法では、混合応答であり、あなたはtweetsをしているし、適切にそれらを処理するためにmentionsをどのされているかを特定する必要があります。

関連する問題