这是我在Heroku的第一次尝试。我能够成功部署"在heroku上,但在访问我的应用程序时,它说" 应用程序失败。"
我遵循了这个指南: https://scotch.io/tutorials/use-mongodb-with-a-node-application-on-heroku
我认为棘手的是因为我使用的是Mongoose,它可能与URI无关。我也在使用mlab插件。
这是我的后端设置:
var request = require('request');
var app = express();
var mongoCredentialss = require('/mongo_credentialss.json');
var conn = mongoose.connection;
var path = require('path');
// connect to the database
mongoose.connect('mongodb://' + mongoCredentials.username + ':' + mongoCredentialss.password + '@ds012345.mlab.com:12345/mydatabase-db');
mongoose.Promise = Promise;
app.listen(3000, function() {
console.log('Listening on 3000...');
});
我没有真正了解.env,让它在本地运行,我只是将我的用户名和密码存储在一个隐藏的.json文件中,这要归功于.gitignore。从指南中,我只是尝试将URI直接嵌入到我的节点文件中作为变量,看看它是否有效。我不太确定隐藏的环境是怎样的?'工作...
稍后当我重新开始时,我也经常遇到heroku没有检测到其标准构建包的问题:set heroku / nodejs
****编辑:
仍然看到一些问题。我拿出了我的mongo信誉'所以我的server.js文件现在看起来像这样:
var express = require('express');
var mongoose = require('mongoose');
mongoose.connect(process.env.MONGODB_URI);
var Promise = require('bluebird');
var bodyParser = require('body-parser');
var randtoken = require('rand-token');
var cors = require('cors');
var request = require('request');
var app = express();
var conn = mongoose.connection;
var fs = require('fs');
var path = require('path');
app.listen(3000, function() {
console.log('Our app is running on http://localhost:' + 3000);
});
进一步的上下文:我有一个主项目文件夹,其中包含2个子文件夹:后端和前端。当我将它部署到heroku时,我将目录更改为主文件夹以部署所有内容。
此外,如果有帮助,请查看我的 package.json :
"dependencies": {
"bluebird": "^3.4.1",
"body-parser": "^1.15.2",
"cors": "^2.7.1",
"express": "^4.14.0",
"mongoose": "^4.5.3",
"my-bcrypt": "^1.0.2",
"rand-token": "^0.2.1",
"request": "^2.74.0"
},
"engines": {
"node": "==6.0.0"
}
}
******编辑2: heroku日志无法找到我的' backend.js'。现在,我有一个主项目文件夹目录,里面是2个文件夹:---> backend.js(节点)和---> frontend.js(角度)
我的package.json看起来像这样:
**"main": "frontend.js",**
"scripts": {
**"start": "node backend.js",**
"test": "echo \"Error: no test specified\" && exit 1"
},
我可能误解了heroku如何找到我的主要.js文件。从我的理解开始'用于节点文件,以及' main' file用于像angular / html这样的前端内容。
答案 0 :(得分:2)
您应该能够通过以下方式将Mongoose连接到您的MLab数据库:
mongoose.connect(process.env.MONGODB_URI);
当您在Heroku上使用插件时,提供程序(本例中为MLab)将为您创建数据库,然后存储连接详细信息(URL与数据库主机,用户名,密码,端口等)作为您的应用程序可以使用的环境变量。
这就是您需要将该环境变量process.env.MONGODB_URI
传递到mongoose.connect
的原因:它会将您连接到正确的数据库=)
更新:由于您更新了问题,我发现了另一个阻止其运行的问题。您需要告诉您的应用程序侦听特定的Heroku端口(不是3000
)。
您应该做的是修改app.listen(3000)
来电,改为:app.listen(process.env.PORT || 3000);
这将强制您的应用程序在Heroku和您本地开发框上正确运行。
答案 1 :(得分:0)
您需要使用此行mongo:
var mongoCredentialss = require('/mongo_credentialss.json');
但是您已在mongoCredentials中将密码设置为:
mongoose.connect('mongodb://' + mongoCredentials.username + ':' + mongoCredentialss.password + '@ds012345.mlab.com:12345/mydatabase-db');
您的用户名绑定到mongoCredential s .username,而不是mongoCredential ss .username
代码中的简单错字必将导致数据库连接错误。