2017-11-11 168 views
0

所以這是我的基本Twitter的機器人,它使用節點查找搜索字詞與@引用,然後找到與之相關GIF動畫:問題部署到Heroku的

//Dependencies 
const Twitter = require('twitter'); 
const http = require('http'); 
const config = require('./config.js'); 
const giphyApiKey = (process.env.apiKey || config.giphy.apiKey); 
let searchString = ""; 
let giphyQueryUrl; 

//Initialize twitter client 
const client = new Twitter({ 
    consumer_key: (process.env.consumer_key || config.twitter.consumer_key), 
    consumer_secret: (process.env.consumer_secret || config.twitter.consumer_secret), 
    access_token_key: (process.env.access_token_key || config.twitter.access_token_key), 
    access_token_secret: (process.env.access_token_secret || config.twitter.access_token_secret) 
}); 

process.on('unhandledRejection', (reason,promise) => { 
    console.log('Unhandled Rejection at:', promise, 'reason:', reason); 
}) 

//This stream checks for statuses containing '@[USERNAME]' references, strips out the relevant seach data and feeds 
//that search data to the queryGiphy function 
client.stream('statuses/filter', {track: '@[USERNAME]'}, (stream) => { 
    stream.on('data', (tweet) => { 
     searchString = 
      tweet.text.substring(tweet.text.indexOf("@[USERNAME]")+"@[USERNAME]".length + 1,tweet.text.length); 
     giphyQueryUrl = "http://api.giphy.com/v1/gifs/search?q="+searchString+"&api_key="+ giphyApiKey +"&limit=5&rating=g"; 
     let replyString = '@' + tweet.user.screen_name + ' '; 
     let giphyUrl = queryGiphy(replyString,giphyQueryUrl); 
    }) 
}) 

//This function will query the Giphy API using the node http module and when it finds a match, posts that to twitter 
//using the gifUrlToPost function 
function queryGiphy(replyString,queryUrl) { 
    http.get(queryUrl, res => { 
     res.setEncoding("utf8"); 
     let body = ''; 
     res.on("data", data => { 
      body += data; 
     }); 
     res.on("end",() => { 
      body = JSON.parse(body); 
      if(postToTwitter(replyString + body.data[0].url)) { 
       return true; 
      } else { 
       return false; 
      } 

     }); 
     res.on("error", error => { 
      console.log("Error: " + error); 
     }) 

    }); 

} 

//This simply posts the url of the gif passed to it 
function postToTwitter(body) { 
    client.post('statuses/update', {status: body}) 
     .then(tweet => { 
      return true; 
     }) 
     .catch(error => { 
      throw error; 
     }); 

} 

我的問題是,當我這個部署heroku,我不斷收到一個超時錯誤,沒有地方連接$ PORT來爲heroku動態分配一個端口。現在,我明白了這一點的本質,我之前已經將小型Web服務器部署到了heroku,並瞭解如何設置環境變量,以便它可以動態分配端口號,以便使用Twitter設置流並查詢Giphy。但我在我的代碼中做什麼?在這種情況下,我不明白在哪裏可以做到這一點?

+0

我並不清楚你的問題的性質,如果你能更具體或解釋一點,我會很樂意幫助 –

+0

所以它的本質是,每一個版本一個我已經看到部署到heroku的節點應用程序有一個根「應用程序」進程,它被分配一個端口用於與外部世界進行通信,如下例所示。我剛剛使用節點作爲運行時環境,沒有創建服務器,所以我不明白我必須爲$ PORT建立連接。我寫了一個procfile for heroku,它有web:node index.js $ PORT,但似乎沒有修復它 –

+0

沒問題,所以你只需要提供一個節點文件?這是你的問題嗎? –

回答

0

你有app.js文件或bin文件,如果你有那麼

app.set('port',(process.env.PORT||5000)); 

app.listen(app.get('port'),function(){ 

}) 

,或者您需要在您的根目錄中創建一個Procfile,推動代碼的Heroku的git

你可能看完這篇文章獲得進一步的澄清 https://devcenter.heroku.com/articles/procfile