无法从heroku托管的MEAN应用

时间:2016-06-08 10:43:27

标签: node.js mongodb heroku mongoose mean-stack

我使用mlab在heroku上托管了我的MEAN应用程序,以提供我需要的mongodb数据库。

在我的应用中,我使用以下方式连接到数据库:

mongoose.connect(process.env.MONGODB_URI);

在我的应用程序中,我声明了我的模型:

mongoose.model('Course', CourseSchema);

如果我理解正确,mongoose会寻找一个名为Courses的集合。

我使用以下方法将一个集合导入mlab:

mongoimport -h <XXX> -d <XXXXX> -c Courses -u <XXXX> -p <XXXX> --file <XXXXX> --jsonArray

有效,消息:imported 350 documents

然而,我的应用程序在本地工作时不会显示任何数据。

可能会发生什么?我是一个初学者,并不知道从哪里开始:)

编辑:

在我的应用中,我对路由触发的数据库有一个get请求:/courses

以下是关于该请求的日志中的内容:

2016-06-09T17:33:57.000199+00:00 app[web.1]: GET /courses 304 2.473 ms - -
2016-06-09T17:34:34.739488+00:00 heroku[router]: at=info method=GET path="/" host=c
mtproto.herokuapp.com request_id=dbdef76d-78b2-4d4c-b509-a18c6194cc18 fwd="87.91.22
.213" dyno=web.1 connect=0ms service=2ms status=304 bytes=147
2016-06-09T17:34:34.734195+00:00 app[web.1]: GET / 304 1.106 ms - -

我真的很困惑,我只是在我的本地数据库(在localhost上)尝试我的应用程序而没有任何问题。

然后我使用我的mongolab uri在本地运行它来连接到由mlab管理的数据库。连接工作(响应:200)但我的应用程序中没有数据。然后我继续使用curl http://localhost:3000/courses并得到一个空数组作为响应。

我不认为问题来自我的get请求的代码,因为它在我连接到我的localhost数据库时起作用。我的获取请求代码:

router.get('/courses', function(req, res, next) {
  Course.find(function(err, courses){
    if(err){ return next(err); }

    res.json(courses);
  }).select({ "name": 1, "_id": 1, 'code': 1, 'courseContentGrade': 1, 'courseTeachingGrade': 1, 'courseAverage': 1});
});

看起来我也成功连接到mlab数据库,因为我得到了200个代码响应。如果我使用帖子请求,我会得到304.

这是db中的数据:

[{
    "_id": {
        "$oid": "5759ddbfe71976730e6df425"
    },
    "code": "XXXXXX ",
    "name": "Negotiation",
    "courseContentGrade": "3.0",
    "courseTeachingGrade": "8.0",
    "courseAverage": "5.5",
    "reviews": [
        {
            "name": "Advanced Negotiation Workshop",
            "professor": "Aenean sed",
            "contentReview": "Lorem ipsum dolor sit amet, consectetur adipiscing",
            "teachingReview": "In in ipsum odio. Nulla sodales nulla vel vulputate lobortis. Curabitur ut.",
            "contentGrade": 3,
            "teachingGrade": 8,
            "average": "5,5",
            "trimester": "T3",
            "day": "Semaine bloquée",
            "time": "Semaine bloquée",
            "round": "1er tour / 1st round",
            "bet": 21,
            "year": "2014/2015",
            "upvotes": 0,
            "author": "Piranha"
        }
    ]
},

{
    "_id": {
        "$oid": "5759ddbfe71976730e6df42a"
    },
    "code": "XXXXXXXX",
    "name": "Germany",
    "courseContentGrade": null,
    "courseTeachingGrade": null,
    "courseAverage": null,
    "reviews": []
}]

还有其他关于我应该检查的提示吗?

2 个答案:

答案 0 :(得分:0)

在部署应用程序时,将API密钥和身份验证相关变量保留在代码库之外是一种很好的做法。这样,即使共享代码库,您的秘密也是安全的。这些秘密可以使用process.env对象应用于运行时,该对象可以存储所有这些环境变量。

对于基于heroku的部署,您可以使用以下命令设置环境变量:

heroku config:set GITHUB_USERNAME=vikramtiwari

更多详情:https://devcenter.heroku.com/articles/config-vars

设置这些变量后,程序可以在运行时使用它。在您的情况下,您的MEAN应用程序正在尝试查找这些值,但无法获取它们,因此不会显示任何数据。检查您的日志(heroku logs)以确认该应用未连接到MongoDB。

答案 1 :(得分:0)

问题解决了!

Mongo不喜欢大写字母,我只用小写字母重命名我的收藏品,现在一切都很完美。

不知道为什么它在我的电脑上工作而不是在heroku上工作......