Phusion Passenger "Error: missing delimiting slash between hosts and options" error while connecting MongoDB cluster

Phusion Passenger "Error: missing delimiting slash between hosts and options" error while connecting MongoDB cluster

我已经部署了自己的 MongoDB 集群。我有一个 运行 Meteor 应用程序,它是 Nginx 顶部的 运行 Phusion Passenger。更新 Nginx 配置文件中的连接字符串后出现以下错误:

/<app_directory>/bundle/programs/server/node_modules/fibers/future.js:280
                                                throw(ex);
                                                ^

Error: missing delimiting slash between hosts and options
    at module.exports (/<app_directory>bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/url_parser.js:37:11)
    at connect (/<app_directory>/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/mongo_client.js:289:16)
    at Function.MongoClient.connect (/<app_directory>/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/mongo_client.js:113:3)
    at new MongoConnection (packages/mongo/mongo_driver.js:175:11)
    at new MongoInternals.RemoteCollectionDriver (packages/mongo/remote_collection_driver.js:4:16)
    at Object.&lt;anonymous&gt; (packages/mongo/remote_collection_driver.js:38:10)
    at Object.defaultRemoteCollectionDriver (packages/underscore.js:784:19)
    at new Mongo.Collection (packages/mongo/collection.js:99:40)
    at AccountsServer.AccountsCommon (packages/accounts-base/accounts_common.js:23:18)
    at new AccountsServer (packages/accounts-base/accounts_server.js:18:5)

当连接字符串以前采用以下格式时,应用程序 运行 正常:

passenger_env_var MONGO_URL mongodb://db_user:db_password@host_name:port_no/db_name;

但是当我尝试通过以下方式更新连接字符串来连接到 mu mongoDB 集群时,它开始显示错误:

passenger_env_var MONGO_URL mongodb://db_user:'password_with_special_character'@host1_name:port_no,host2_name:port_no/db_name?replicaSet=replica_set_name;

连接字符串有问题还是其他问题?

这不是 Passenger 的问题,它只是在您配置时传递字符串。通常您会用引号将整个字符串括起来,例如:

passenger_env_var MONGO_URL 'mongodb://db_user:password_with_special_character@host1_name:port_no,host2_name:port_no/db_name?replicaSet=replica_set_name;'

问题是Mongo客户端需要理解字符串,这意味着你需要使用它支持的转义机制,比如URL编码。例如,如果密码包含 @,您可以 URL 将其编码为 %40:

# password = p@ssword, @ = url encoded as %40
passenger_env_var MONGO_URL 'mongodb://username:p%40ssword@host:port/dbname';

您可以看到其他特殊字符 here 的默认 URL 编码。