0

这是企业项目的一部分。我正在尝试在我公司建立的 stackato 服务器上托管一个应用程序。我的应用程序有一个支持 mongodb 的节点框架。我编写了一个简单的脚本来尝试连接到 db 服务并插入一个 JSON 对象。我能够成功连接到数据库,但在插入时,返回错误消息:

MongoError:未授权在 db:componentlist 上插入

我的代码:

var mongo = require('mongodb');
var Db = mongo.Db;
var Server = mongo.Server;
var services;
var dbcreds;

var dbcreds = {
  //cant paste due to confidential reasons
};

  var server = new Server(
          dbcreds.host,
          dbcreds.port, 
          {user: dbcreds.username, pass: dbcreds.password}
      );

  db = new Db(dbcreds.db, server,{w:1});
  console.log('connecting to online db and now storing data in:' + dbcreds.db);


db.open(function(err, db) {
    if (err) { console.log('db connection error: ' + err);}
    console.log('db is opened.');

    var component = [
    {
        platform: "alpha",
        component1: "beta",

    }];

    db.collection('componentlist', function(err,collection){
        collection.insert(component, function(err, result){
        if(err){console.log("cannot insert the object into componentlist " + err);}         
        db.close();
        });
    });     

});

当我在安装了 node 和 mongodb 的机器上运行它时,终端会返回这个。这些是一组可以与代码相关的控制台日志消息

连接到在线数据库,现在将数据存储在:db,数据库已打开。,无法将对象插入组件列表 MongoError:未授权在 db.componentlist 上插入

我在网上查了db,再次确认没有数据插入成功。我是否缺少任何额外的授权命令?

4

2 回答 2

2

不确定用于身份验证的服务器选项。现在首选的方法是使用MongoClient类进行连接,如下所示:

var MongoClient = require("mongodb").MongoClient;

MongoClient.connect(
    "mongodb://<user>:<pass>@<host>:<port>/<db>", function(err, db) {

    // everything else inside your "open.db" call

这是首选,但以防万一传递凭据的方式有问题,因为这种方式有据可查。这只是为了确保您以您打算使用的用户帐户进行连接。

除此之外,只要这是正确的用户,则错误表明该用户缺乏在数据库上执行插入的权限。因此,您可能需要检查已授予该用户的权限。因此,该帐户需要应用readWrite角色。

于 2014-03-07T10:11:45.807 回答
1

抱歉,如果这是一个很晚的回复,但也许这可以帮助其他有类似问题的人。但我在 Stackato 环境中遇到了同样的问题。因此,您似乎将数据库名称设置为“componentlist”,但在 Stackato 中,它将执行 mongodb URI 替换,该替换通常具有随机生成的用户名、密码和某些固定设置的主机和端口,如果您使用 stackato 登录到您的 stackato 实例ssh 并运行“env”命令,您可能会看到用于连接到由 stackato 创建的 mongodb 服务的确切 URI。数据库名称很可能是“db”,并且由于您尝试连接到“componentlist”,因此您将遇到授权失败。

如果您将数据库名称更改为“db”,它可能会起作用。我试图弄清楚如何在我的 stackato.yml 文件中将数据库名称设置为更具体的名称。

于 2015-07-09T17:47:34.363 回答