Heroku + MEAN 堆栈错误:参数“url”必须是字符串,而不是未定义

Posted

技术标签:

【中文标题】Heroku + MEAN 堆栈错误:参数“url”必须是字符串,而不是未定义【英文标题】:Heroku + MEAN Stack Error: Parameter "url" must be a string, not undefined 【发布时间】:2017-12-04 21:03:14 【问题描述】:

我正在关注 Heroku 上的 tutorial 构建一个 MEAN Stack Contact APP,但我遇到了一些奇怪的错误!虽然我的应用程序在部署后运行良好,但当我在本地运行该应用程序时无法连接到 Mongodb。我得到的错误是:

url.js:88 throw new TypeError('Parameter "url" 必须是字符串,而不是' + typeof url); ^

TypeError: 参数“url”必须是字符串,不是未定义的 在 Url.parse (url.js:88:11) 在 Object.urlParse [解析] (url.js:82:5) 在 module.exports (/Users/Ananda/mean-contactlist/node_modules/mongodb/lib/url_parser.js:15:23) 在连接时 (/Users/Ananda/mean-contactlist/node_modules/mongodb/lib/mongo_client.js:480:16) 在 Function.MongoClient.connect (/Users/Ananda/mean-contactlist/node_modules/mongodb/lib/mongo_client.js:244:3) 在对象。 (/Users/Ananda/mean-contactlist/server.js:17:21) 在 Module._compile (module.js:570:32) 在 Object.Module._extensions..js (module.js:579:10) 在 Module.load (module.js:487:32) 在 tryModuleLoad (module.js:446:12)

根据我的理解,当我使用“节点服务器”启动应用程序时,它找不到 mongodb 数据库 url ...只是不知道为什么,因为它在 heroku 上运行时发现它很好。我还能做些什么来在本地运行这个应用程序?他们在Github 上有完整的应用程序。我也克隆了它并尝试在本地运行它并收到错误。为什么它在部署时工作但在本地不工作?

【问题讨论】:

【参考方案1】:

这是因为 mongo 客户端使用的是在远程服务器中定义但不是本地定义的环境变量。只要未定义 MONGODB_URI(在 server.js 中),您就可以使用默认值:

// Connect to the database before starting the application server. 
mongodb.MongoClient.connect(process.env.MONGODB_URI || 'mongodb://localhost:27017/myLocalDb', function (err, database) 
  if (err) 
    console.log(err);
    process.exit(1);
  

在这种情况下,您的本地 MongoDB 必须正在运行,并且在您创建新用户时将创建一个名为 myLocalDb 的数据库。

或者,如果您不想更改代码,您可以向 MONGODB_URI 声明一个本地值:

set MONGODB_URI='mongodb://localhost:27017/myLocalDb'

【讨论】:

【参考方案2】:

解决此错误并从 mLab 连接到 MongoDB 数据库的另一种方法是在计算机上手动设置环境路径。 将您的环境变量命名为MONGODB_URI并将您的MongoDB uri从mLab粘贴到您的变量值mongodb://<dbuser>:<dbpassword>@ds131687.mlab.com:31687/example的输入中。保存并重新启动您的程序。 验证环境路径是否在节点模式下成功保存运行

console.log(process.env.MONGODB_URI)

您会看到您的 mLab 数据库的 uri 记录到您的控制台。

How to set up an environment path on windows

How to set up an environment path on Mac

【讨论】:

以上是关于Heroku + MEAN 堆栈错误:参数“url”必须是字符串,而不是未定义的主要内容,如果未能解决你的问题,请参考以下文章

在 Heroku 上部署 MEAN 应用程序时出现应用程序错误

在 Heroku 问题上部署平均堆栈应用程序

已成功上传到 Heroku Local,但一旦推送到 Heroku live 就会出现 503 错误

在heroku中部署平均堆栈应用程序时出错

Heroku 上的空白页 - mean.js Angular 应用程序

node-pre-gyp:heroku push 中的权限被拒绝