Node.js + Mongoose 可以在本地工作,但不能在 Heroku 上工作

Posted

技术标签:

【中文标题】Node.js + Mongoose 可以在本地工作,但不能在 Heroku 上工作【英文标题】:Node.js + Mongoose works locally, but not on Heroku 【发布时间】:2012-04-01 14:25:00 【问题描述】:

这是我在 Heroku 上运行的 node.js 文件。它在本地完美运行,但是当我将它推送到 Heroku 时,不会创建数据库集合,也不会引发任何错误。最终,我只是想让它在 Heroku 上运行时实际创建连接。谢谢。

var mongoose = require('mongoose'),
    db_url = process.env.MONGOHQ_URL || "mongodb://john:<mypasswordwashere>@staff.mongohq.com:10053/app3305538",
    db = mongoose.connect(db_url),
    Schema = mongoose.Schema;

//Mongoose DB Test
var MsgSchema = new Schema(
    date: type: Date, default: Date.now,
    message: String
);
var MsgModel = db.model("messages", MsgSchema);
var Msg = new MsgModel();
Msg.message = "blurgh";
Msg.save();

【问题讨论】:

【参考方案1】:

另一个可能的混淆来源是,如果您同时采购 MongoLab 和 MongoHQ,那么 Heroku tutorial 中提供的默认连接字符串将中断您的数据库会话:

var mongoUri = process.env.MONGOLAB_URI || process.env.MONGOHQ_URL || 'mongodb://localhost/mydb';

即:如果您只使用同时安装了两者的 MongoHQ,则应丢弃 process.env.MONGOLAB_URI

【讨论】:

【参考方案2】:

你在heroku中指定了节点版本吗?

请参考这个。 (我也混淆了同样的问题。但解决了。) http://devcenter.heroku.com/articles/nodejs-versions

【讨论】:

【参考方案3】:

您对.save() 的调用需要一个回调函数。尝试在其中添加一条调试消息,看看它是否显示有关失败原因的任何信息,如下所示:

Msg.save(function(err)
  if(err) 
    console.log("Error:", err);
  else
    console.log("success");
  
)

那么你应该可以在heroku日志中看到结果了。

【讨论】:

我添加了控制台消息,但在 Heroku 日志中都没有调用它们。 添加调试消息以确定您的脚本挂在哪一行代码上。很可能是 mongoose.connect,它可能与 MONGOHQ_URL 有关。尝试在本地设置环境变量并在本地使用 mongoose 而不是从 heroku 连接到 mongohq 实例。 你能仔细检查一下 + 发布 heroku 应用程序使用的 nodejs 版本(和 mongodb 驱动程序版本)吗?

以上是关于Node.js + Mongoose 可以在本地工作,但不能在 Heroku 上工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mongoose/Node.js 中同时保存多个文档?

Node.js Mongoose .update 与 ArrayFilters

Node.js 和 Mongoose 的管理面板 [关闭]

使用 JWT (Node.js + mongoose) 在 REST API 中管理用户权限的最佳方法

Node.js:如何在 mongoose.js 中执行 count 命令?

Node JS mongoose 创建博文评论系统