Openshift - 身份验证:通过 mongojs 连接 mongodb 时找不到用户

Openshift - auth: couldn't find user while connecting mongodb via mongojs

我正在按照本教程在我的 openshift 帐户上主持休息 API:

Day 27: Restify–Build Correct REST Web Services in Node.js

根据我的要求我做了一些改动,下面是代码:

server.js

var restify = require('restify');
var mongojs = require('mongojs');

var ip_addr = process.env.OPENSHIFT_NODEJS_IP || '127.0.0.1';
var port    =  process.env.OPENSHIFT_NODEJS_PORT || 8080;

var server = restify.createServer({name: 'bemeta'});
server.use(restify.queryParser());
server.use(restify.bodyParser());
server.use(restify.CORS());

server.listen(port, ip_addr, function(){
              console.log(server.name + ' listening at url ' + server.url);
              });

var connectionString = '127.0.0.1:27017/bemeta';

if(process.env.OPENSHIFT_MONGODB_DB_PASSWORD){
    connectionString = process.env.OPENSHIFT_MONGODB_DB_USERNAME + ':' +
    process.env.OPENSHIFT_MONGODB_DB_PASSWORD + '@' +
    process.env.OPENSHIFT_MONGODB_DB_HOST + ':' +
    process.env.OPENSHIFT_MONGODB_DB_PORT + '/' +
    process.env.OPENSHIFT_APP_NAME;
}

var db = mongojs(connectionString, ['bemeta']);
var beRecords = db.collection("be_records");

var PATH = '/be_records';

// get all records
server.get({path: PATH, version:'0.0.1'}, findAllRecords);

// create new record
server.post({path: PATH, version:'0.0.1'}, createRecord);

// defining call backs
function findAllRecords(req, res, next){
    res.setHeader('Access-Control-Allow-Origin', '*');
    beRecords.find(function(err, docs){
                   console.log('Response docs ' + docs);
                   console.log('Error '+ err);

                   if(docs){
                   res.send(200, docs);
                   return next();
                   }

                   return next(err);
                   });
}


function createRecord(req, res, next){
    res.setHeader('Access-Control-Allow-Origin', '*');

    var beRecord = {};
    beRecord.be_id = req.params.be_id;
    beRecord.item_title = req.params.item_title;
    beRecord.item_description = req.params.item_description;
    beRecord.item_link = req.params.item_link;

    beRecords.save(beRecord, function(err, docs){
                   console.log('Response docs ' + docs);
                   console.log('Error '+ err);
                   if(docs){
                   res.send(201, beRecord);
                   return next();
                   }
                   else {
                   next(err);
                   }
                   });
}

当我 运行 它在本地并通过在下面键入 url:

通过邮递员发出获取请求时
http://127.0.0.1:8080/be_records

我得到的回复是:[],这是正确的,因为我没有在相应的集合中插入任何文档。

但是当我 运行 它在我的 openshift 帐户中并通过在下面输入 url:

通过邮递员发出获取请求时
http://bemeta-{domain-name}.rhcloud.com/be_records

我得到的回复是:

{
  "code": "InternalError",
  "message": "auth fails"
}

在我的 rhc 控制台中,我看到以下消息:

==> app-root/logs/mongodb.log <==
Wed Feb 24 01:32:23.543 [conn3]  authenticate db: bemeta { authenticate: 1, user: "admin", nonce: "some nonce", key: "some key" }
Wed Feb 24 01:32:23.544 [conn3] auth: couldn't find user admin@bemeta, bemeta.system.users

我不确定它为什么要尝试查找用户 - admin@bemeta,可能是我在这里遗漏了一些东西,我没有任何这样的用户,但我有一个用于连接到的管理员用户mongodb.

这是我的数据库的快照(如 RockMongo 中所示):

有什么想法吗?

身份验证错误是由于未对 admin 用户访问 bemeta 数据库进行身份验证造成的(有关详细信息,请参阅上面的问题评论)。

用户可以使用 RockMongo 接口进行身份验证,如下所示:
Select 数据库 -> 更多 -> 身份验证 -> 添加用户。