为什么在 Heroku return 未定义的 MongoLab 中找到语句?
Why find statement in MongoLab with Heroku return undefined?
我现在在 Heroku 应用程序中使用 Node.js,在 MongoLab 服务中使用 MondoDB。我在 localhost DB 和 MongoLab 中放入了一个 collection 下一个文档。
{
"person": "Jon Smith",
"age": 57
}
然后我使用下一个脚本来获取文档。
var express = require('express');
var app = express();
var mongojs = require('mongojs');
var databaseUrl = process.env.MONGOLAB_URI || 'mongodb://localhost/person';
var collections = ['person'];
var db = mongojs(databaseUrl, collections);
app.set('port', (process.env.PORT || 3000));
app.use(express.static(__dirname + '/public'));
app.get('/person', function (request, response) {
db.person.find(function (err, docs) {
console.log(docs);
response.json(docs);
});
});
app.listen(app.get('port'), function () {
console.log('[SERVER]', new Date(), 'Start');
});
访问时http://localhost:3000/person I get the Json the inserted document, but when access http://my-heroku-app.herokuapp.com/person没有。我已经测试了环境变量并检查了配置数据。
让我们考虑一下这些是如何成为 MangoLab 数据的:
- 数据库:heroku_database
- Collection: 人
- 用户:heroku_user
还有环境变量,像这样:
- MONGOLAB_URI - mongodb://heroku_user:密码@subdomain.mongolab.com:port/heroku_database
这是我在 Heroku 中的日志:
2015-10-08T06:35:45.728792+00:00 app[web.1]: > my-app@0.0.1 start /app
2015-10-08T06:35:45.728794+00:00 app[web.1]: > node server.js
2015-10-08T06:35:45.728795+00:00 app[web.1]:
2015-10-08T06:35:46.105279+00:00 app[web.1]: [SERVER] Thu Oct 08 2015 06:35:46 GMT+0000 (UTC) Start
2015-10-08T06:35:46.682857+00:00 heroku[web.1]: State changed from starting to up
2015-10-08T06:35:46.697341+00:00 heroku[web.1]: Process exited with status 143
2015-10-08T06:36:05.210688+00:00 heroku[router]: at=info method=GET path="/" my-heroku-app.herokuapp.com request_id="blah-blah-blah" dyno=web.1 connect=1ms service=17ms status=200 bytes=918
2015-10-08T06:36:05.512399+00:00 heroku[router]: at=info method=GET path="/controllers/controller.js" host=my-heroku-app.herokuapp.com request_id="blah-blah-blah" dyno=web.1 connect=1ms service=4ms status=200 bytes=503
2015-10-08T06:36:07.828198+00:00 heroku[router]: at=info method=GET path="/person" host=my-heroku-app.herokuapp.com request_id="blah-blah-blah" fwd="ip.ip.ip.ip" dyno=web.1 connect=1ms service=31ms status=200 bytes=178
2015-10-08T06:36:07.822645+00:00 app[web.1]: undefined
真正的问题不在 Heroku 中,而是在 MongoDB 身份验证中。当我尝试查找文档时出现下一个错误:
{
[MongoError: auth failed]
name: 'MongoError',
message: 'auth failed',
ok: 0,
errmsg: 'auth failed',
code: 18
}
MongoDB 3.0现在支持多种认证机制,认证机制应该通知mongo.js
。在 MongoDB 3.0 中,身份验证机制从 MongoCR 更改为 SCRAM-SHA-1。
这解决了问题:
var db = mongojs(databaseURL, collections, {authMechanism: 'ScramSHA1'});
我现在在 Heroku 应用程序中使用 Node.js,在 MongoLab 服务中使用 MondoDB。我在 localhost DB 和 MongoLab 中放入了一个 collection 下一个文档。
{
"person": "Jon Smith",
"age": 57
}
然后我使用下一个脚本来获取文档。
var express = require('express');
var app = express();
var mongojs = require('mongojs');
var databaseUrl = process.env.MONGOLAB_URI || 'mongodb://localhost/person';
var collections = ['person'];
var db = mongojs(databaseUrl, collections);
app.set('port', (process.env.PORT || 3000));
app.use(express.static(__dirname + '/public'));
app.get('/person', function (request, response) {
db.person.find(function (err, docs) {
console.log(docs);
response.json(docs);
});
});
app.listen(app.get('port'), function () {
console.log('[SERVER]', new Date(), 'Start');
});
访问时http://localhost:3000/person I get the Json the inserted document, but when access http://my-heroku-app.herokuapp.com/person没有。我已经测试了环境变量并检查了配置数据。
让我们考虑一下这些是如何成为 MangoLab 数据的:
- 数据库:heroku_database
- Collection: 人
- 用户:heroku_user
还有环境变量,像这样:
- MONGOLAB_URI - mongodb://heroku_user:密码@subdomain.mongolab.com:port/heroku_database
这是我在 Heroku 中的日志:
2015-10-08T06:35:45.728792+00:00 app[web.1]: > my-app@0.0.1 start /app
2015-10-08T06:35:45.728794+00:00 app[web.1]: > node server.js
2015-10-08T06:35:45.728795+00:00 app[web.1]:
2015-10-08T06:35:46.105279+00:00 app[web.1]: [SERVER] Thu Oct 08 2015 06:35:46 GMT+0000 (UTC) Start
2015-10-08T06:35:46.682857+00:00 heroku[web.1]: State changed from starting to up
2015-10-08T06:35:46.697341+00:00 heroku[web.1]: Process exited with status 143
2015-10-08T06:36:05.210688+00:00 heroku[router]: at=info method=GET path="/" my-heroku-app.herokuapp.com request_id="blah-blah-blah" dyno=web.1 connect=1ms service=17ms status=200 bytes=918
2015-10-08T06:36:05.512399+00:00 heroku[router]: at=info method=GET path="/controllers/controller.js" host=my-heroku-app.herokuapp.com request_id="blah-blah-blah" dyno=web.1 connect=1ms service=4ms status=200 bytes=503
2015-10-08T06:36:07.828198+00:00 heroku[router]: at=info method=GET path="/person" host=my-heroku-app.herokuapp.com request_id="blah-blah-blah" fwd="ip.ip.ip.ip" dyno=web.1 connect=1ms service=31ms status=200 bytes=178
2015-10-08T06:36:07.822645+00:00 app[web.1]: undefined
真正的问题不在 Heroku 中,而是在 MongoDB 身份验证中。当我尝试查找文档时出现下一个错误:
{
[MongoError: auth failed]
name: 'MongoError',
message: 'auth failed',
ok: 0,
errmsg: 'auth failed',
code: 18
}
MongoDB 3.0现在支持多种认证机制,认证机制应该通知mongo.js
。在 MongoDB 3.0 中,身份验证机制从 MongoCR 更改为 SCRAM-SHA-1。
这解决了问题:
var db = mongojs(databaseURL, collections, {authMechanism: 'ScramSHA1'});