Mongoose 未在 Ubuntu Ubuntu 14.04 上连接
Mongoose not connecting on Ubuntu Ubuntu 14.04
我有一个使用 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
});
没有这个,应用程序加载正常,尽管没有数据。所以我的想法是 mongoose 永远无法正确连接。
我正在使用 g运行t-shell-spawn 来 运行 一个检查 mongo 是否已经 运行ning 的脚本,如果不是它启动它。我不是 100% 确定 droplet 需要这个,但我在本地遇到问题 mongo 已经 运行ning... 脚本:
/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/
中寻找数据库文件。会不会是 dokku 的 mongodb:link appName mydb
把它链接到了错误的位置?也许 process.env.MONGODB_URL
设置不正确?我真的不知道从这里去哪里。
事实证明,我的问题的解决方案是在我的 Droplet 的主机文件中添加一个条目以指向 mongo 数据库 url:
127.0.0.1 mongodb.myurl.com
出于某种原因,使用 Dokku 将数据库链接到我的应用程序并没有添加这一点。我会认为它是自动的。当我将数据库链接到应用程序时,应用程序容器的主机文件确实获得了 mongodb 条目。
我有一个使用 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
});
没有这个,应用程序加载正常,尽管没有数据。所以我的想法是 mongoose 永远无法正确连接。
我正在使用 g运行t-shell-spawn 来 运行 一个检查 mongo 是否已经 运行ning 的脚本,如果不是它启动它。我不是 100% 确定 droplet 需要这个,但我在本地遇到问题 mongo 已经 运行ning... 脚本:
/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/
中寻找数据库文件。会不会是 dokku 的 mongodb:link appName mydb
把它链接到了错误的位置?也许 process.env.MONGODB_URL
设置不正确?我真的不知道从这里去哪里。
事实证明,我的问题的解决方案是在我的 Droplet 的主机文件中添加一个条目以指向 mongo 数据库 url:
127.0.0.1 mongodb.myurl.com
出于某种原因,使用 Dokku 将数据库链接到我的应用程序并没有添加这一点。我会认为它是自动的。当我将数据库链接到应用程序时,应用程序容器的主机文件确实获得了 mongodb 条目。