将nodejs / mongoose部署到heroku

时间:2016-08-27 16:35:34

标签: node.js mongodb heroku buildpack mlab

这是我在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这样的前端内容。

2 个答案:

答案 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

代码中的简单错字必将导致数据库连接错误。