(узел: 4800) Предупреждение об необработанном отказе от обещания: MongoParseError: неэкранированный раздел авторизации при входе в parseConnectionString - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь подключить мое приложение nodejs к mongoDB, используя mlab, но получаю ошибку, которая мне не понятна.

let mongoose=require('mongoose');

const server='ds211275.mlab.com:11275';
const database='customer_db'
const user='gaurav'
const password='gaurav@5295'


mongoose.connect(`mongodb://${user}:${password}@${server}/${database}`, {useNewUrlParser: true})


let customerSchema=new mongoose.Schema({
    name:String,
    email:{
        type:String,
        required:true,
        unique:true
    }
})

Это фактический результат моего кода:


server has started on 3000
(node:4800) UnhandledPromiseRejectionWarning: MongoParseError: Unescaped at-sign in authority section
    at parseConnectionString (/home/admybrand/Desktop/Gaurav's Stuff/rest-api/node_modules/mongodb-core/lib/uri_parser.js:450:21)
    at connect (/home/admybrand/Desktop/Gaurav's Stuff/rest-api/node_modules/mongodb/lib/operations/mongo_client_ops.js:180:3)
    at connectOp (/home/admybrand/Desktop/Gaurav's Stuff/rest-api/node_modules/mongodb/lib/operations/mongo_client_ops.js:284:3)
    at executeOperation (/home/admybrand/Desktop/Gaurav's Stuff/rest-api/node_modules/mongodb/lib/utils.js:420:24)
    at MongoClient.connect (/home/admybrand/Desktop/Gaurav's Stuff/rest-api/node_modules/mongodb/lib/mongo_client.js:168:10)
    at Promise (/home/admybrand/Desktop/Gaurav's Stuff/rest-api/node_modules/mongoose/lib/connection.js:521:12)
    at new Promise (<anonymous>)
    at NativeConnection.Connection.openUri (/home/admybrand/Desktop/Gaurav's Stuff/rest-api/node_modules/mongoose/lib/connection.js:518:19)
    at Mongoose.connect (/home/admybrand/Desktop/Gaurav's Stuff/rest-api/node_modules/mongoose/lib/index.js:270:15)
    at Object.<anonymous> (/home/admybrand/Desktop/Gaurav's Stuff/rest-api/src/models/customer.model.js:9:10)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Module.require (module.js:596:17)
(node:4800) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing insideof an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 3)
(node:4800) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Ответы [ 2 ]

0 голосов
/ 04 августа 2019

Просто замените знак @ на% 40. это решит это.

0 голосов
/ 24 января 2019

хорошо, так как из-за пароля @ он не может понять, какую часть он должен рассматривать как пароль или хост, если вы видите строковый формат Монго:

mongodb://<user>:<pass>@<host>:<port>/<db_name>

здесь Пароль и Хост отделен от @ и, если есть еще один @, скажем, в вашем случае его внутренний пароль, Mongo String будет выглядеть так:

mongodb://<user>:<pass_1st_part>@<pass_2nd_part>@<host>:<port>/<db_name> что не приемлемо,

для этого вы можете сделать что-то вроде этого:

Вариант 1 :

mongoose.connect(`mongodb://<USER_NAME>:${encodeURIComponent('<P@SS>')}@<HOST>:<PORT>/<DB_NAME>`)

Здесь мы кодируем пароль с помощью encodeURIComponent(), поэтому p@ss станет p%40ss.

Примечание: иногда вам может понадобиться добавить { uri_decode_auth: true } в option . если вы используете драйвер mongo netive.

Вариант 2 :

mongoose.connect('mongodb://<HOST>:<PORT>/<DB_NAME>',
                 {user: '<USER_NAME>', pass: '<P@SS>'});
...