2016-09-26 3 views
-1

Ich habe mit der API von flickr experimentiert und bin auf der Suche um die Anwendung zu Heroku jetzt einzusetzen, dass ich fertig bin. Um dies zu tun, versuche ich, seit ich MongoDB verwende, dass es mit mLab läuft. Ich kann in die Schale einzuloggen ganz gut, ich kann das ganze Ding zu laufen, wenn ich die URL in die Datenbank als Zeichenfolge verwenden, aber plötzlich, als ich zuweisen diese URL process.env.MONGOLAB_URI mit SET MONGOLAB_URI="mongodb://dbuser:[email protected]:41506/flick r_image_search" (Ich verwende Windows 10) in der lokale Befehlszeile und versuchen Sie es zu verwenden, es funktioniert nicht mehr. Die Fehlermeldung, die ich bekomme, ist "Fehler: ungültiges Schema, erwarteter Mongodb". Selbst wenn ich console.log(url) verwendete, gab es "mongodb://dbuser:[email protected]:41506/flickr_image_search" zurück (ich garantiere, dass der Benutzername und das Passwort, die ich in der Befehlszeile verwendete, absolut korrekt sind, da ich die URL, die in der Befehlszeile verwendet wurde, kopiert und eingefügt habe). Die IDE, die ich verwende, ist Visual Studio Code und ich habe nicht das Heroku mLab Add-on verwendet, um dies zu tun, aber meine Datenbank auf der Website selbst. Ich habe keine Ideen mehr und kann Hilfe gebrauchen. Hier ist jede entsprechende Datei von Code, den ich für die Anwendung mit:URL funktioniert, bis ich es process.env.MONGOLAB_URI über die Kommandozeile gesetzt

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

Bei der Einstellung der Umgebungsvariablen meinten Sie Folgendes: 'heroku config: set MONGOLAB_URI = mongodb: // dbuser: [email protected]: 41506/flickr_image_search', oder ist der Befehl unter Windows anders? https://devcenter.heroku.com/articles/config-vars – pneumee

+0

Sollte angegeben haben. Wenn ich lokal getestet habe, habe ich 'SET MONGOLAB_URI =" mongodb: // dbuser: [email protected]: 41506/flickr_image_search "'. Bevor ich das überhaupt versuchte, versuchte ich es mit der String-URL, die funktionierte. Nachdem der SET-Befehl fehlgeschlagen ist, ging ich weiter und habe den Befehl 'heroku config: gesetzt: MONGOLAB_URI = mongodb: // dbuser: [email protected]: 4 1506/flickr_image_se arch' und dann auf Heroku verteilt um zu sehen, ob es dort funktionieren würde. Beides hat mir keinen Erfolg gebracht. –

+0

Nachdem Sie die Umgebungsvariable 'MONGOLAB_URI' eingestellt haben, können Sie sie erfolgreich über' heroku config: get MONGOLAB_URI' abrufen? Wenn dies der Fall ist, loggt die Anmeldung an der Konsole während der Ausführung auf Heroku die richtige URL ein? Und wenn es protokolliert, was Sie erwarten, erhalten Sie den gleichen Fehler "Fehler: ungültiges Schema, erwartete Mongodb" beim Verbinden? – pneumee

Antwort

2

Heroku Anwendungen MONGODB_URI, aber Sie haben MONGOLAB_URI.

Dies könnte erklären, warum die Zeichenfolge funktioniert, aber die Umgebungsvariable nicht.

versuchen Sie bitte diese in der Shell: heroku config

die Heroku Konfigurationsvariable finden. Ich wage es zu erraten ist MONGODB_URI und nicht MONGOLAB_URI.

Wenn dies der Fall ist, setzen Sie Ihre Umgebung und Heroku Konfigurationsvariable MONGODB_URI zu verwenden.

Sie sagten in einem Kommentar: "Ich bin nicht sicher, wie man es auf Heroku überprüft, vor allem da die App nicht darauf laufen will. Heroku hat mir Probleme bei der Bereitstellung von Anwendungen im Allgemeinen gegeben."

Um Ihre Konfigurationsvariablen zu überprüfen, können Sie heroku config in Ihre Shell eingeben oder Sie können zu Ihrem App-Dashboard navigieren. Klicke auf Einstellungen. Klicken Sie auf Reveal Config Vars. enter image description here

Während Sie sich im Dashboard befinden, können Sie das mLab-Add-on bereitstellen, das Heroku bereitstellt, indem Sie auf die Registerkarte Ressourcen klicken. Geben Sie dann im Suchfeld des Add-ons mLab MongoDB ein. enter image description here Klicken Sie darauf. Dies bringt Sie zur Benutzeroberfläche von mlap, wo Sie Ihre Sammlungen anzeigen und verwalten können.

Wenn Sie sich fragen, wie das Server-Setup aussieht, lesen Sie den folgenden Code. Dies verbindet sich gegebenenfalls mit Ihrer lokalen und der 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

Tut mir leid, dass ich so lange gebraucht habe, um zu antworten, ich habe Projekte bearbeitet. Nicht sicher, ob die Umgebungsvariable auf MONGODB_URI gesetzt wurde oder nicht, aber das Problem war, dass ich den Code in der Befehlszeile und die Portvariable gesetzt habe. Ich habe 'MONGODB_URI =" mongodb: // dbuser: [email protected]: 41506/flickr_image_s earch "' als Gegensatz zu 'MONGODB_URI = mongodb: // dbuser: [email protected] verwendet: 41506/flickr_image_s earch'. Zum Schluss wird der Port auf 3000 || gesetzt process.env.PORT' scheint nicht zu funktionieren, aber wenn ich Port auf 'process.env.PORT' setze, läuft es gut –

+0

Verlorenes Zimmer im vorherigen Kommentar. Der Grund, warum ich skeptisch bin, die Umgebungsvariable auf MONGODB_URI zu setzen, war hilfreich, weil ich MONGOLAB_URI in der Befehlszeile mit folgendem Befehl setzen würde: 'heroku config: set MONGOLAB_URI = mongodb: // dbuser: [email protected] .de: 41506/flickr_image_ s earch'. Danach wird es auf dem Aktivitäts-Feed auf Heroku mit "Set MONGOLAB_URI' config var" als Bestätigung angezeigt. Deswegen denke ich, dass ich die Umgebungsvariable so eingestellt habe. Danke, dass du mir geholfen hast! @ Vincentjp @ pneumee –

1

Es war mir hilfreich dotenv (https://www.npmjs.com/package/dotenv) zu installieren, require ('dotenv'), dann dotenv.load() vor process.env Variablen zu deklarieren. Jetzt werden Sachen in meiner .env-Datei eingelesen, wo es vorher nicht war. Danke.

Verwandte Themen