2016-09-26 122 views
-1

我一直在嘗試與Flickr的API,我期待現在,我完成了將應用程序部署到Heroku的。爲了做到這一點,因爲我使用MongoDB,我試圖讓它與mLab一起運行。我可以登錄到shell中,我可以在將URL作爲字符串使用到數據庫時運行整個事件,但突然間當我將該URL分配給process.env.MONGOLAB_URISET MONGOLAB_URI="mongodb://dbuser:[email protected]:41506/flick r_image_search"(我使用的是Windows 10)本地命令行並嘗試使用它,它停止工作。 我收到的錯誤消息是「錯誤:無效的模式,預期的mongodb」。即使當我用console.log(url)它返回"mongodb://dbuser:[email protected]:41506/flickr_image_search"(我保證我在命令行中使用的用戶名和密碼都是絕對正確的考慮我簡直複製粘貼+我用工作進入命令行的網址),我期望的那樣。我使用的IDE是Visual Studio Code,我沒有使用heroku mLab插件來運行這個,但是我的數據庫在網站上。我沒有想法,可以使用一些幫助。這裏的每個代碼相關的文件,我使用的應用程序:URL工作,直到我通過命令行設置它爲process.env.MONGOLAB_URI

app.js

var express = require('express'); 
var app = express(); 
var flickr = require('./flickr.js'); 
var mongo = require('mongodb').MongoClient; 
var path = require('path'); 
var url = process.env.MONGOLAB_URI; 

var today = new Date(); 
var day = today.getDate(); 
var month = today.getMonth()+1; 
var year = today.getFullYear(); 
var mins = today.getMinutes(); 
var hr = today.getHours(); 

today = month + '/' + day + '/' + year + ' ' + hr + ':' + mins; 

var obj; 
var search; 

app.get('/', function(req, res){ 
    res.sendFile(path.join(__dirname + '/index.html')); 
}); 

app.get('/latest', function(req, res){ 
    mongo.connect(url, function(err, db){ 
     if(err) throw err; 
     var theCollection = db.collection('flickr_image_search'); 
     theCollection.find({}).toArray(function(err, docs){ 
      if(err) throw err; 
      search = docs; 
      return docs; 
     }); 
     db.close(); 
    }); 
    res.send(search); 
}); 

app.get(['/search/:text/:offSet2', '/search/:text'], function(req, res){ 
    var lookInIt = req.params.text; 
    var listLength = req.params.offSet2; 
    var searched = flickr.search(lookInIt, listLength || 10); 

    obj = { 
      query: lookInIt, 
      offSet: listLength, 
      date: today 
     }; 

    mongo.connect(url, function(err, db){ 
     if(err) throw err; 
     var imageSearch = db.collection('flickr_image_search'); 
     imageSearch.insert(obj); 
     db.close(); 
    }); 

    res.send(searched); 

}); 


var port = 3000 || process.env.PORT; 

app.listen(port, process.env.IP, function(){ 
    console.log('LISTENING'); 
}); 

flickr.js

var private = require('./private');  

var Flickr = require("flickrapi"), 
    flickrOptions = { 
     api_key: private.key, 
     secret: private.secret 
    }; 

var obj; 

function search (query, offSet) { 
    Flickr.tokenOnly(flickrOptions, function (err, flickr) { 
     if (err) throw err; 
     flickr.photos.search({ 
      text: query, 
      page: 1, 
      per_page: offSet, 
      sort: "relevance" 
     }, function (err, result){ 
      if(err) throw err; 

      result = result.photos.photo; 

      for(var key in result){ 

       var picUrl = 'https://farm' + result[key]["farm"] + '.staticflickr.com/' + result[key]["server"] + '/' + result[key].id + '_' + result[key].secret + '.jpg' 
       result[key].picUrl = picUrl; 

       var userUrl = 'https://www.flickr.com/photos/' + result[key].owner + '/' + result[key].id; 
       result[key].userUrl = userUrl; 

       delete result[key]["ispublic"]; 
       delete result[key]["isfriend"]; 
       delete result[key]['isfamily']; 
       delete result[key]['id']; 
       delete result[key]['owner']; 
       delete result[key]['server']; 
       delete result[key]['farm']; 
       delete result[key]['secret']; 
      } 
      obj = result; 
     }); 

    }); 

    return obj; 
} 

module.exports.search = search; 

的index.html

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" /> 

<title>flickr Image Search</title> 

<div class='container'> 
    <h1 class='text-center'>Flickr Image Search</h1> 

    <h3 class='well'>To get a series of URLs for images, type 'search/whatever-you-want-to-search/the-amount-of-photos-you-want-returned' in the address bar after 'someWebsite.com/'. 
    If you want to see the most latest searches that were searched, instead of 'search/whatever-you-want-to-search/the-amount-of-photos-you-want-returned' type 'latest'. 
    When you find the URL that you want, just copy+paste!</h3> 

    <p class=lead>This application is purely functional, so chances are the queries won't return clean.</p> 
    <p>This is an application that searches through the photos of Flickr, using its API.</p> 
</div> 
+0

設置環境變量時,你的意思是:'heroku config:set MONGOLAB_URI = mongodb:// dbuser:[email protected]:41506/flickr_image_search',或者命令與Windows不同? https://devcenter.heroku.com/articles/config-vars – pneumee

+0

應該已經指定。當我在本地進行測試時,那是我做了'SET MONGOLAB_URI =「mongodb:// dbuser:[email protected]:41506/flickr_image_search」'。之前我甚至嘗試過這樣做,但我嘗試使用字符串URL進行操作。 SET命令失敗後,我繼續執行命令'heroku config:set MONGOLAB_URI = mongodb:// dbuser:[email protected]:4 1506/flickr_image_se arch',然後部署到Heroku看看它是否會在那裏工作。這些都沒有給我任何成功。 –

+0

設置好'MONGOLAB_URI'環境變量後,能否通過'heroku config:get MONGOLAB_URI'成功獲取?如果是這樣,在heroku上運行時將其記錄到控制檯將記錄正確的uri?如果它正在記錄您期望的內容,您是否在連接時獲得相同的「錯誤:無效的模式,預期的mongodb」錯誤? – pneumee

回答

2

Heroku的用途MONGODB_URI,但你有MONGOLAB_URI

這可以解釋爲什麼字符串可以工作,但環境變量不能。

試着鍵入這在你的shell:heroku config

查找Heroku的配置變量。我敢冒險猜測它是MONGODB_URI而不是MONGOLAB_URI

如果是這種情況,請重置環境和Heroku的配置變量使用MONGODB_URI

您在評論中說:「我不確定如何在Heroku上檢查它,特別是因爲該應用程序不希望在那裏運行,Heroku一般在部署應用程序時一直給我帶來麻煩。

要檢查你的配置變量,你可以在你的shell中鍵入heroku config,或者您可以瀏覽到您的應用程序儀表板。點擊設置。點擊Reveal Config Vars。​​

當你在儀表板,就可以爲他們提供了MLAB插件,提供的Heroku通過單擊資源選項卡上。然後在Add-on的搜索框中輸入mLab MongoDB。 enter image description here 點擊它。這將帶你到mLab的GUI,在那裏你可以查看和管理你的收藏。

如果您想知道服務器設置的外觀,請參閱下面的代碼。這將連接到您的本地和mLab db適當的地方。

if(process.env.MONGODB_URI) { 
mongoose.connect(process.env.MONGODB_URI); 

}else { 

mongoose.connect(db, function(err){ //db = 'mongodb://localhost/yourdb' 
    if(err){ 
    console.log(err); 
    }else { 
    console.log('mongoose connection is successful on: ' + db); 
    } 
}); 
} 
+0

抱歉花了很長時間回覆,我一直在做項目。不知道將環境變量設置爲MONGODB_URI是否有幫助,但最終導致問題的是我在命令行中設置代碼的方式以及端口變量。我一直使用'MONGODB_URI =「mongodb:// dbuser:[email protected]:41506/flickr_image_s earch」'反對'MONGODB_URI = mongodb:// dbuser:[email protected]: 41506/flickr_image_s earch'。最後,將端口設置爲'3000 || process.env.PORT'似乎不起作用,但是當我將port設置爲'process.env.PORT'時,它運行正常 –

+0

在之前的評論中丟失了空間。我對將環境變量設置爲MONGODB_URI持懷疑態度的原因很有幫助,因爲我將使用以下命令在命令行中設置MONGOLAB_URI:'heroku config:set MONGOLAB_URI = mongodb:// dbuser:[email protected] .COM:41506/flickr_image_小號earch'。之後,它將顯示在Heroku的活動源上,並將「設置'MONGOLAB_URI'配置var」作爲確認。正因爲如此,我認爲這正是我設置環境變量的方式。謝謝你的協助! @vincentjp @pneumee –

1

它已經幫助我安裝dotenv(https://www.npmjs.com/package/dotenv),要求( 'dotenv'),然後dotenv.load()聲明process.env變量之前。現在我的.env文件中的內容被讀入之前沒有的地方。謝謝。

相關問題