将 nodejs/mongoose 部署到 heroku

Posted

技术标签:

【中文标题】将 nodejs/mongoose 部署到 heroku【英文标题】:Deploying nodejs/mongoose to heroku 【发布时间】:2017-01-04 03:15:07 【问题描述】:

这是我第一次尝试 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 无法检测到其标准 buildpacks:set heroku/nodejs 的问题

****编辑:

仍然看到一些问题。我拿出了我的“mongo creds”,所以我的 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 (node) 和 --->frontend.js (angular)

我的 package.json 看起来像这样:

**"main": "frontend.js",**
  "scripts": 
    **"start": "node backend.js",**
    "test": "echo \"Error: no test specified\" && exit 1"
  ,

我可能误解了 heroku 是如何找到我的主要 .js 文件的。据我了解,'start' 用于节点文件,'main' 文件用于前端文件,如 angular/html 文件。

【问题讨论】:

将所有内容从子文件夹移到主文件夹(backend.js、frontend.js、css 文件、html 文件)后,我可以再次确认我可以在本地运行我的应用程序。但是当将 FRESH 部署到新的 heroku 应用程序时,我现在得到以下日志: 2016-08-27T20:45:26.674272+00:00 heroku[web.1]: State changed from crashed to started 2016-08-27T20:45 :28.574699+00:00 heroku[web.1]:使用命令启动进程node backend.js 2016-08-27T20:45:30.818329+00:00 heroku[web.1]:进程以状态 1 退出 2016-08-27T20:45:30.753675+00:00 应用程序[web.1]: module.js:341 2016-08-27T20:45:30.753686+00:00 应用程序[web.1] 1]:抛出错误; 2016-08-27T20:45:30.753687+00:00 应用程序 [web.1]: ^ 2016-08-27T20:45:30.753687+00:00 应用程序 [web.1]: 2016-08-27T20:45:30.753692 +00:00 app[web.1]:错误:找不到模块'/app/backend.js' 2016-08-27T20:45:30.753694+00:00 app[web.1]:在 Function.Module._load (module.js:290:25) 2016-08-27T20:45:30.753693+00:00 应用[web.1]:在 Function.Module._resolveFilename (module.js:339:15) 2016-08-27T20:45:30.753695+00:00 app[web.1]: 在 Function.Module.runMain (module .js:447:10) 2016-08-27T20:45:30.753696+00:00 app[web.1]: 在启动时 (node.js:148:18) 2016-08-27T20:45:30.753697+00: 00 应用 [web.1]:在 node.js:405:3 【参考方案1】:

您应该能够通过以下操作将 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 和您的本地开发框上正确运行。

【讨论】:

哇!抱歉,如果我误解了这一点,但要澄清一下,我什至不需要 Heroku 中的 mlab 插件?我确实已经有一个 mlab 帐户,但我认为我需要插件才能使其同步......有点像我需要一个单独的 postgresql 数据库以使其与我拥有的另一个应用程序一起工作。无论如何,从指南来看,似乎 .env 是在终端中作为单独文件制作的......这是真的,还是只是我在我拥有的 server.js 文件中输入的所有内容? 您确实需要 mlab 插件。添加后,该特殊环境变量将神奇地存在于您的应用程序中,然后您可以使用我在上面粘贴的代码连接到该数据库。在您的示例代码中,您正在连接到您拥有的另一个独立数据库。但是您想按照我向您展示连接到 mlab 的方式来代替 =) 哇,你真快!我现在对测试它感到非常兴奋,很快就会报告,谢谢哥们! :) 刚刚做了一个:heroku logs --tails 发现我可能部署了我的文件夹目录的错误部分。要再试一次,从“后端”文件夹部署它,以便更容易找到我的 package.json ...这没有意义 b/c 我想我需要部署整个东西而不是后端的东西. 我也刚刚看到您的更新,并在我的答案中添加了更多详细信息,请参阅更新后的文本。您需要更改您的app.listen() 呼叫才能在 Herkou 上正常工作 =)【参考方案2】:

你需要 mongo 使用这一行:

 var mongoCredentialss = require('/mongo_credentialss.json');

但您已在 mongoCredentials 中将密码设置为:

 mongoose.connect('mongodb://' + mongoCredentials.username + ':' + mongoCredentialss.password + '@ds012345.mlab.com:12345/mydatabase-db');

您的用户名绑定到 mongoCredentials.username 而不是 mongoCredentialss.username

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

【讨论】:

以上是关于将 nodejs/mongoose 部署到 heroku的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 + NodeJS + Mongoose - 从 Angular 2 发布数据到 rest api nodejs 后端。节点 api 日志:选项 /url,POST 标头不起作用

NodeJS + Mongoose:MissingSchemaError:模式尚未注册模型“类别”

Express/NodeJS + Mongoose App 服务器响应慢

ObjectId 的 NodeJS/Mongoose 模式数组

MongoDB / Mongoose / nodejs 中的引用 - 并行化

nodejs mongoose安装问题