无法从 heroku 托管的 MEAN 应用程序访问 mLab 数据库

Posted

技术标签:

【中文标题】无法从 heroku 托管的 MEAN 应用程序访问 mLab 数据库【英文标题】:mLab database not accessible from heroku hosted MEAN app 【发布时间】:2016-10-08 14:09:35 【问题描述】:

我使用 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

然而,我的应用在本地运行时并未显示任何数据。

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

编辑:

在我的应用程序中,我有一个由路由触发的数据库获取请求:/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 - -

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

然后我使用我的 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": []
]

关于我应该检查什么的任何其他提示?

【问题讨论】:

您是否在 Heroku 中设置了进程环境变量? 【参考方案1】:

问题解决了!

Mongo 不喜欢大写字母,我只用小写字母重命名了我的集合,现在一切正常。

不知道为什么它可以在我的计算机上运行而不是在 heroku 上...

【讨论】:

【参考方案2】:

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

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

heroku config:set GITHUB_USERNAME=vikramtiwari

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

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

【讨论】:

感谢您的回答。我必须设置什么样的变量?我认为 MONGODB_URI 足以连接到数据库。我查看了该链接上是否还有其他设置:devcenter.heroku.com/articles/mean-apps-restful-api 我错过了什么? 如果您的 MONGODB_URI 已设置,那么它应该可以连接。检查您的日志以获取任何信息。 设置好了,我只有那个变量,应该还有其他的吗?你给了我一个 github 的例子,有什么原因吗?我无法理解日志,我将编辑我的问题以包含日志,什么让我感到困惑:)

以上是关于无法从 heroku 托管的 MEAN 应用程序访问 mLab 数据库的主要内容,如果未能解决你的问题,请参考以下文章

Node.js MEAN Stack App 在本地工作,但无法部署到 Heroku

Heroku中来自外部文件的角度路由

Heroku + MEAN 堆栈错误:参数“url”必须是字符串,而不是未定义

如何从 Heroku 访问远程 MySQL 数据库?

从托管在 Heroku 的在线 PHP 站点连接数据库

无法将 AWS-Postgres 服务器与带有 heroku 托管的 Spring Boot 应用程序连接起来