为什么在 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 中的日志:

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'});