URL 有效,直到我通过命令行将其设置为 process.env.MONGOLAB_URI

Dou*_*Cal 1 command-line flickr heroku mongodb mlab

我一直在试验 flickr 的 API,现在我已经完成了,希望将应用程序部署到 Heroku。为了做到这一点,由于我使用的是 MongoDB,我试图让它与 mLab 一起运行。我可以很好地登录到 shell,当我将数据库的 URL 作为字符串使用时,我可以让整个事情运行,但是当我在本地命令中将该 URL 分配给process.env.MONGOLAB_URIwith SET MONGOLAB_URI="mongodb://dbuser:dbpassword@ds041506.mlab.com:41506/flick r_image_search"(我使用的是 Windows 10)时,我可以让整个事情运行线并尝试使用它,它停止工作。 我收到的错误消息是“错误:无效架构,需要 mongodb”。 即使当我使用console.log(url)它返回"mongodb://dbuser:dbpassword@ds041506.mlab.com:41506/flickr_image_search"(我保证我在命令行中使用的用户名和密码都是绝对正确的,因为我确实复制并粘贴了我在命令行中使用的 URL)正如我所期望的那样。我使用的 IDE 是 Visual Studio Code,我没有使用 heroku mLab 插件来运行它,但我在网站上使用了我的数据库。我没有想法,可以使用一些帮助。这是我用于应用程序的每个相关代码文件:

应用程序.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');
});
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

索引.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>
Run Code Online (Sandbox Code Playgroud)

vin*_*tjp 5

Heroku 使用MONGODB_URI,但您拥有MONGOLAB_URI.

这可以解释为什么字符串有效但环境变量无效。

尝试在你的 shell 中输入: heroku config

找到 heroku 配置变量。我冒昧地猜测它是MONGODB_URI而不是MONGOLAB_URI

如果是这种情况,请重置您的环境和 heroku 配置变量以使用MONGODB_URI.

你在评论中说:“我不知道如何在 Heroku 上检查它,特别是因为应用程序不想在那里运行。Heroku 在部署应用程序时一直给我带来麻烦。”

要检查您的配置变量,您可以输入heroku config您的 shell,或者您可以导航到您的应用程序仪表板。单击设置。单击显示配置变量。在此处输入图片说明

当您在仪表板中时,您可以通过单击“资源”选项卡来配置 Heroku 提供的 mLab 插件。然后在附加组件的搜索框中,输入 mLab MongoDB。 在此处输入图片说明 点击它。这将带您进入 mLab 的 GUI,您可以在其中查看和管理您的收藏。

如果您想知道服务器设置是什么样的,请参阅下面的代码。这将在适当的情况下连接到您的本地和 mLab 数据库。

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);
  }
 });
}
Run Code Online (Sandbox Code Playgroud)

  • 抱歉这么久才回复,我一直在做项目。不确定将环境变量设置为 MONGODB_URI 是否有帮助,但最终的问题是我在命令行中设置代码的方式和端口变量。我一直使用 `MONGODB_URI="mongodb://dbuser:dbpassword@ds041506.mlab.com:‌ 41506/flickr_image_s‌ earch"` 作为反对 `MONGODB_URI=mongodb://dbuser:dbpassword@ds041506.mlab.com: ‌ 41506/flickr_image_s‌ ear`。最后,将端口设置为`3000 || process.env.PORT` 似乎不起作用,但是当我将端口设置为 `process.env.PORT` 时它运行良好 (2认同)