使用systemd连接到MongoDB的Linux(Debian)上的Host Meteor(MeteorJS).错误:URL必须采用mongodb:// user:pass @ host:port/dbname格式

Gra*_*hew 3 debian mongodb node.js meteor systemd

我有一个简单的Meteor网络应用程序,我试图在我自己的服务器上托管.服务器细节;

  • Debian(Jessie)Linux 3.16.0-4-amd64#1 SMP Debian 3.16.7-ckt2-1(2014-12-08)x86_64 GNU/Linux
  • systemd
  • NodeJS版本0.10.36
  • 流星版1.0.3.1
  • MongoDB版本2.6.7

/etc/systemd/system/customwebapp.service文件;

[Service]
ExecStart=/usr/bin/node /opt/customwebapp/bundle/main.js
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=customwebapp
User=customwebapp
Group=customwebapp
Environment=NODE_ENV=production MONGO_URL='mongodb://localhost'

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

我使用创建服务帐户;

sudo useradd -mrU customwebapp
Run Code Online (Sandbox Code Playgroud)

我使用构建Meteor应用程序;

sudo meteor build --directory /opt/customwebapp
cd /opt/customwebapp/programs/server
sudo npm install
Run Code Online (Sandbox Code Playgroud)

我尝试注册服务;

sudo systemctl enable customwebapp
sudo systemctl start customwebapp
Run Code Online (Sandbox Code Playgroud)

Syslog报告如下;

/opt/customwebapp/bundle/programs/server/node_modules/fibers/future.js:173
Error: URL must be in the format mongodb://user:pass@host:port/dbname
at Error (<anonymous>)
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几个小时来解决这个问题.我使用了许多不同的MONGO_URL值.我使用mongo命令在MongoDB中创建了一个admin或root用户,并将user:pass @ localhost:27017/customwebapp格式放入URL环境变量中.

无论我做什么,它都会带来同样的错误.

我也试过使用Meteor Up但它似乎配置Upstart而不是systemd.

不言而喻,我已经尝试过SO的大量解决方案.并非所有我尝试过的解决方案都列在这里.

我怀疑我遇到问题的原因是因为systemd.

这是我关于SO的第一个问题,因为,老实说,我遇到的大多数问题都摆在我面前.因此帮助我并且有很多次.现在我希望SO能再次提供帮助.

感谢您抽出宝贵时间提供帮助.

Gra*_*hew 6

好的,我在挖掘NodeJS核心模块Url中的源代码后发现了这个问题

从上面的问题可以看出,我使用这一行在服务单元文件中设置了环境;

Environment=NODE_ENV=production MONGO_URL='mongodb://localhost'
Run Code Online (Sandbox Code Playgroud)

Node Url模块正在检测单引号'并用%27替换它们.这导致Url.parse函数无法设置主机值.

以下是在多行上设置环境值而没有单引号的正确方法;

Environment=NODE_ENV=production
Environment=MONGO_URL=mongodb://localhost
Environment=ROOT_URL=http://localhost:8080
Environment=PORT=8080
Run Code Online (Sandbox Code Playgroud)

总是那些小的语法问题不是它.