2016-04-04 20 views
0

我有兩個函數,查詢Twitter的API。查詢是通過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

這是你的服務器端代碼?你在使用任何數據庫嗎?你可以讀/寫/從一個'JSON'文件進行開發 – cl3m

+0

@ cl3m這是服務器端代碼。我沒有使用數據庫。我只是想將我從twitter api收到的數據直接發送到我的Web界面 –

+0

如何從您的Web界面調用您的服務器代碼?你在使用某種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

據我所知,你是不希望保存數據,而只是收集多個異步調用的結果ce全部完成後將數據交付給客戶?如果是這樣,您可以使用asyncpromises

在堆棧溢出中已經有這樣的例子,例如。這Node.js: Best way to perform multiple async operations, then do something else?但這裏反正兩個簡化的實現。

使用異步

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

使用承諾

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

我不知道你用的是什麼HTTP客戶端,但你也許可以用var client = Promise.promisifyAll(require('your-client-lib'));轉換的方法,以返回承諾,然後您可以將tweetsmentions函數轉換爲

var tweets = function(y) { 
    return client.get('statuses/user_timeline', {screen_name: y, count: 1}); 
}; 

這種方式雖然在Promise.allresults有不同的反應,你需要確定哪些是tweets的,哪些是mentions正確處理它們。

相關問題