无法从 heroku 托管的 MEAN 应用程序访问 mLab 数据库
mLab database not accessible from heroku hosted MEAN app
我使用 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 请求代码上,因为它在我连接到我的本地主机数据库时有效。我的获取请求代码:
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 代码 response.I 如果我使用 post 请求,则得到 304。
数据库中的数据如下所示:
[{
"_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": []
}]
关于我应该检查什么的任何其他提示?
在部署您的应用程序时,最好将 API 密钥和与身份验证相关的变量保留在代码库之外。这样你的秘密是安全的,即使代码库是共享的。可以使用可以存储所有此类环境变量的 process.env
对象将这些秘密应用于 运行 时间。
对于基于 heroku 的部署,您可以使用以下命令设置环境变量:
heroku config:set GITHUB_USERNAME=vikramtiwari
更多详情:https://devcenter.heroku.com/articles/config-vars
一旦设置了这些变量,您的程序就可以在 运行 时间内使用它。在您的情况下,您的 MEAN 应用程序正在尝试查找这些值,但无法获取它们,因此不会显示任何数据。检查您的日志 (heroku logs
) 以确认该应用未连接到 MongoDB。
问题已解决!
Mongo 不喜欢大写字母,我只用小写字母重命名了 collection,现在一切正常。
不知道为什么它在我的电脑上运行而不是在 heroku 上运行...
我使用 mlab 在 heroku 上托管了我的 MEAN 应用程序,以提供我需要的 mongodb 数据库。
在我的应用程序中,我使用以下方式连接到数据库:
mongoose.connect(process.env.MONGODB_URI);
在我的应用程序中,我声明了我的模型:
mongoose.model('Course', CourseSchema);
如果我没理解错的话,mongoose 会寻找名为 Courses 的集合。
我已经使用 :
将一个集合导入 mlabmongoimport -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 请求代码上,因为它在我连接到我的本地主机数据库时有效。我的获取请求代码:
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 代码 response.I 如果我使用 post 请求,则得到 304。
数据库中的数据如下所示:
[{
"_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": []
}]
关于我应该检查什么的任何其他提示?
在部署您的应用程序时,最好将 API 密钥和与身份验证相关的变量保留在代码库之外。这样你的秘密是安全的,即使代码库是共享的。可以使用可以存储所有此类环境变量的 process.env
对象将这些秘密应用于 运行 时间。
对于基于 heroku 的部署,您可以使用以下命令设置环境变量:
heroku config:set GITHUB_USERNAME=vikramtiwari
更多详情:https://devcenter.heroku.com/articles/config-vars
一旦设置了这些变量,您的程序就可以在 运行 时间内使用它。在您的情况下,您的 MEAN 应用程序正在尝试查找这些值,但无法获取它们,因此不会显示任何数据。检查您的日志 (heroku logs
) 以确认该应用未连接到 MongoDB。
问题已解决!
Mongo 不喜欢大写字母,我只用小写字母重命名了 collection,现在一切正常。
不知道为什么它在我的电脑上运行而不是在 heroku 上运行...