0

我有一个使用 MongoDB 和 mongoose 在 Hapi 上构建的节点应用程序。在本地,我可以毫无问题地使用该应用程序。我可以连接到数据库、添加数据、查找数据等。

我在 Digital Ocean 上创建了一个 Ubuntu 14.04 x64 droplet。

我可以通过 ssh 进入我的 droplet 并验证我的数据库是否以正确的名称存在。我正在使用 dokku-alt 进行部署,并且我已使用 dokku 将数据库名称链接到应用程序mongodb:link appName mydb

一旦我将应用程序部署到它会挂起并最终超时的地方,我就遇到了问题。经过大量调试和注释代码后,我发现每当我尝试像这样点击 mongo 时,应用程序都会挂起:

var User = request.server.plugins.db.User;
User
  .findOne({ id: request.auth.credentials.profile.raw.id })
  .exec(function(err, user){
    // do something
  });

没有这个,应用程序可以正常加载,尽管没有数据。所以我的想法是猫鼬永远不会正确连接。

我正在使用 grunt-shell-spawn 运行一个脚本,该脚本检查 mongo 是否已经在运行,如果没有,它会启动它。我不是 100% 确定在 droplet 上需要这个,但是我在本地 mongo 已经运行的地方遇到了问题......脚本:

/startMongoIfNotRunning.sh

if pgrep mongod; then
  echo running;
else
  mongod --quiet --dbpath db/;
fi

exit 0;

/Gruntfile.js

shell: {
  make_dir: {
    command: 'mkdir -p db'
  },
  mongodb: {
    command: './startMongoIfNotRunning.sh',
    options: {
      stdin: false,
    }
  }
},

这是我定义数据库位置的方式:

/index.js

server.register([
  { register: require('./app/db'), options: { url: process.env.MONGODB_URL || 'mongodb://localhost:27017/mydb' } },
....

/app/db/index.js

var mongoose = require('mongoose');
var _ = require('lodash-node');
var models = require('require-all')(__dirname + '/models');

exports.register = function(plugin, options, next) {

  mongoose.connect(options.url, function() {
    next();
  });

  var db = mongoose.connection;

  plugin.expose('connection', db);
  _.forIn(models, function(value, key) {
    plugin.expose(key, value);
  });

};

exports.register.attributes = {
  name: 'db'
};

我的应用正在寻找db/. 难道是dokkumongodb:link appName mydb把它链接到了错误的位置?也许process.env.MONGODB_URL没有正确设置?我真的不知道从这里去哪里。

4

1 回答 1

0

事实证明,我的问题的解决方案是在我的 droplet 的 hosts 文件中添加一个条目以指向 mongo db url:

127.0.0.1 mongodb.myurl.com

出于某种原因,使用 Dokku 将数据库链接到我的应用程序并没有添加这一点。我会认为它是自动的。当我将数据库链接到应用程序时,应用程序容器的主机文件确实获得了一个 mongodb 条目。

于 2015-02-16T18:34:01.647 回答