将 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 模式数组