我有一个使用 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
没有正确设置?我真的不知道从这里去哪里。