Ошибка амортизации с анализатором UR и ошибка соединения, неполная пара значений ключа, монго - PullRequest
0 голосов
/ 08 ноября 2018

У меня странная проблема с Монго, которая выдает мне ошибки, которые я не могу решить. Это странно, потому что мой код все еще работает. Если я достигну своей конечной точки, я получу свои данные, все отлично, верно? Но я все равно предпочел бы, чтобы над мной не висела какая-то ошибка, которая может быть проблемой в будущем.

Я провел некоторое исследование этих ошибок в SO, в частности обнаружил: Необработанное отклонение обещания: ошибка: URL искажен, не может быть проанализирован и Неполная пара значений ключей для опции remote mongodb , но нет решений, которые могли бы сработать.

My Mongo - это версия 4.0.2. Я подключаюсь через Mongoose, v5.3.9.

Это ошибка:

(node:5305) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
connection error { MongoParseError: Incomplete key value pair for option
    at parseQueryString (/Users/jonathankuhl/Documents/Programming/JavaScript/Vue/100daysv3/node_modules/mongodb-core/lib/uri_parser.js:387:13)
    at parseConnectionString (/Users/jonathankuhl/Documents/Programming/JavaScript/Vue/100daysv3/node_modules/mongodb-core/lib/uri_parser.js:447:21)
    at QueryReqWrap.dns.resolveTxt [as callback] (/Users/jonathankuhl/Documents/Programming/JavaScript/Vue/100daysv3/node_modules/mongodb-core/lib/uri_parser.js:127:7)
    at QueryReqWrap.onresolve [as oncomplete] (dns.js:245:10)
  name: 'MongoParseError',
  [Symbol(mongoErrorContextSymbol)]: {} }

Вот код подключения, большая часть которого извлечена и изменена непосредственно из руководства по началу работы с Mongoose, поскольку я никогда раньше не использовал Mongoose:

const mongoose = require('mongoose');
const user = process.env.MONGO_USER;
const pw = process.env.MONGO_PW;
const uri = `mongodb+srv://${user}:${pw}@cluster0-vji0s.mongodb.net/100days?test?retryWrites=true`;

// wrap the connection in a closure so I can export it with the URI
function Connect(uri) {
    return function() {
        mongoose.connect(uri, {
            auth: {
                user: user,
                password: pw
            }
        });

        const db = mongoose.connection;
        db.on('error', console.error.bind(console, 'connection error'));
        db.once('open', ()=> {
            console.log('\nSuccessfully connected to Mongo!\n');
        });
    }
}

const MongooseConnect = Connect(uri);

module.exports = MongooseConnect;

И на моем сервере (Express JS) я подключаюсь, как только мой сервер работает:

const MongooseConnect = require('./database.js');

//... other express stuff

app.listen(port, ()=> {
    MongooseConnect();
    console.log(`listening on port ${port}\n`)
});

Код работает, я подключаюсь и попадаю в свою базу данных, и просто отлично выполняю CRUD. Я не всегда получал эту ошибку (ну, не пару ключей, у меня всегда было предупреждение об устаревании, и я просто выбрасывал банку на потом), но я понятия не имею, что вызвало его изменение. Самые последние изменения, которые я сделал, были в том, чтобы переместить мои схемы в их собственную папку, я не понимаю, почему это может вызвать это. Я не знаю, что вызывает появление этих сообщений об ошибках или что нужно сделать, чтобы они исчезли. Все, что я пробовал в приведенных выше ссылках, не работает и не ухудшает ситуацию.

Любая помощь будет оценена

Кроме того, мое имя пользователя и пароль не используют никаких специальных символов, только цифры и буквы.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Здесь есть две разные ошибки.

Чтобы исправить current URL string parser is deprecated, см. Ответ Брэндона (используйте userNewUrlParser).

Чтобы исправить MongoParseError: Incomplete key value pair for option, строка подключения, которая у вас есть, не является допустимым URI:

const uri = `mongodb+srv://${user}:${pw}@cluster0-vji0s.mongodb.net/100days?test?retryWrites=true`;

Обратите внимание на /100days?test?retryWrites... часть. Ошибка говорила, что test не является допустимой парой ключ-значение. Либо удалите 100days, либо удалите test, например ::

mongodb+srv://${user}:${pw}@cluster0-vji0s.mongodb.net/test?retryWrites=true

или

mongodb+srv://${user}:${pw}@cluster0-vji0s.mongodb.net/100days?retryWrites=true

См. Унифицированный идентификатор ресурса для получения информации о формате URI.

0 голосов
/ 08 ноября 2018

Чтобы исправить ошибку newUrlParser, вам просто нужно изменить свой вызов mongoose connect на:

mongoose.connect(uri, {
    auth: {
        user: user,
        password: pw
    },
    useNewUrlParser: true 
});

Я бы посмотрел, если бы это решило другую проблему, просто чтобы быть уверенным.

Редактировать: Я думаю, я знаю, что вызывает другую проблему

Строка подключения:

mongodb+srv://${user}:${pw}@cluster0-vji0s.mongodb.net/100days?test?retryWrites=true

Рассматриваемая часть: /100days?test?retryWrites=true

Это неправильная строка запроса. Я не уверен, что вы пытались присвоить test параметр, но попробуйте это сейчас /100days?retryWrites=true

Если вам нужно несколько параметров в строке запроса, синтаксис будет /100days?retryWrites=true&secondParam=value&thirdParam=thing ...

Ошибка заключалась в том, что параметр test не имеет значения, так как нет части =value. Вероятно, он выбросил всю строку запроса. Таким образом, ваш код должен был работать как обычно, без установки retryWrites=true.

Надеюсь, это помогло!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...