【问题标题】:Error Running MongoDB Script on OpenShift Gear在 OpenShift Gear 上运行 MongoDB 脚本时出错
【发布时间】:2024-10-08 09:35:01
【问题描述】:

我编写了一个数据库填充脚本(在 JavaScript 中),以便我可以轻松地在本地和服务器上运行它。我想从命令行运行它,所以我所要做的就是将它推送到服务器/设备并执行它。该脚本在我的本地运行良好,但是当我尝试在 OpenShift 设备上运行它时,它会出现以下错误:

MongoDB shell version: 2.4.9
connecting to: 127.XX.XXX.X:27017/admin
Sat Sep 12 12:20:25.979 count failed: { "ok" : 0, "errmsg" : "unauthorized" } 
at src/mongo/shell/query.js:180
failed to load: ./Create.js

我正在尝试执行命令:

[xxxxxx-xxxxxx.rhcloud.com scripts]\> mongo ./Create.js

我已经包含了我的文件的内部内容。我遗漏了所有文档创建的东西。只知道我将文档添加到数组中。

// Switch to the DB we want
var connection;
try {
    // Try to connect to local first
    connection = new Mongo();
}
catch(err) {
    // If error, connect to OpenShift server
    connection = new Mongo('127.XX.XXX.X:27017');
}

db = connection.getDB('xxxxxxx');

// Create array to store documents
var newDocs = [];

...
// Documents are added to newDocs here
...

// If any new documents exist, insert them
if(newDocs.length) {
    var bulk = db.xxxxxxx.initializeUnorderedBulkOp();

    newDocs.forEach(function (doc) {
        bulk.insert(doc);
    });

    bulk.execute();
    print('NEW DOCS INSERTED');
}
else {
    print('NO NEW DOCS');
}

【问题讨论】:

    标签: javascript mongodb openshift mongodb-shell


    【解决方案1】:

    看起来您缺少用于连接到 openshift 上的 mongodb 数据库的用户名/密码?看看你得到的错误“未经授权...”

    【讨论】:

      【解决方案2】:

      我使用db.auth('username', 'password'); 进行身份验证。最终,我在脚本中添加了一个变量来跟踪我是在本地还是在服务器上运行脚本。然后我使用了一个变量作为密码,这样我就不会在脚本中使用数据库密码了。我使用--eval 选项从命令行输入密码。以下是修改后的脚本头:

      // Switch to the DB we want
      var connection;
      var isLocal = true;
      try {
          // Try to connect to local first
          connection = new Mongo();
      }
      catch(err) {
          // If error, connect to OpenShift server
          connection = new Mongo('127.XX.XXX.X:27017');
          isLocal = false;
      }
      
      db = connection.getDB('xxxxxxx');
      
      if(!isLocal) {
          // If on server, authenticate
          db.auth('username', password);
      }
      
      // Create array to store documents
      var newDocs = [];
      

      然后,要从服务器上的命令行运行脚本,我使用以下命令:

      mongo --eval "var password = 'xxxxxxx';" Create.js
      

      【讨论】: