Nodejs не может ответить более чем на один запрос на проверку соединения с mongoose - PullRequest
0 голосов
/ 31 мая 2019

Я довольно новичок в мангусте и ноде.Я пытаюсь написать простой API с использованием Nodejs и Express, в котором я отправляю URI MongoDB, и, если он действителен, то есть работает комбинация имени пользователя и пароля, и соединение с этим URI успешно установлено, должно быть возвращено сообщение об успехе.

Сначала я попытался создать отдельную функцию, чтобы попытаться подключиться к указанному URI:

function testURI(uri) {
   mongoose.connect(uri, {useNewUrlParser: true} );
   mongoose.connection.on("connected", function() { return true } );
}

module.exports.test = function(req, res) {
   var uri = req.body.uri;
   if(testURI(uri)) res.status(200).json({'success': true});
   else res.status(400).json({'success': false});
};

Но это не удалось, поскольку mongoose подключается асинхронно, а обратный вызов события «connected» несмог вернуть true для основной функции

Поэтому я отбросил идею для отдельной функции и вместо этого попытался реализовать ее в функции module.exports.test:

module.exports.test = function(req, res) {
   var uri = req.body.uri;
   mongoose.connect(uri, { useNewUrlParser: true, connectTimeoutMS: 2500 });

   mongoose.connection.on("connected", function() {
       mongoose.connection.close();
       res.status(200).json({'success': true});
   });

 mongoose.connection.on("error", function(err) {
        result = {
            'error': true,
            'errorMsg': 'Error: Could not connect to the given host.'
        }
        mongoose.connection.close();
        res.status(400).json(result);
    });
};

Это работаетхорошо, за исключением того, что сервер умирает после ответа на один запрос.Когда я пытаюсь использовать недопустимый URI, он возвращает HTTP 400, как и ожидалось, но затем, когда я отправляю другой запрос с другим URI, приложение просто вылетает с ошибкой

Ошибка: невозможно установить заголовкипосле их отправки.

А затем мне нужно перезапустить приложение, прежде чем я смогу отправить другой запрос.Очевидно, две отдельные res.status(200).json и res.status(400).json в одном контроллере создают проблему, и приложение обрабатывает последующие запросы также как один и тот же запрос.

1 Ответ

0 голосов
/ 31 мая 2019

Исправлена ​​проблема путем создания пользовательского промежуточного программного обеспечения.Вместо того, чтобы возвращать результат через res.status().json() в функции контроллера, я использовал эту функцию в качестве промежуточного программного обеспечения и возвратил результат из следующей функции

module.exports.test = function(req, res, next) {
   var uri = req.body.uri;
   mongoose.connect(uri, { useNewUrlParser: true, connectTimeoutMS: 2500 });

   mongoose.connection.on("connected", function() {
       mongoose.connection.close();
       req.status = 200;
       req.result = {'success': true};
       next();
   });

 mongoose.connection.on("error", function(err) {
        result = {
            'error': true,
            'errorMsg': 'Error: Could not connect to the given host.'
        }
        mongoose.connection.close();
        req.status = 400;
        req.result = result;
        next();
    });
};

module.exports.returnDb = function(req, res) {
    res.status(req.status).json(req.result);
};

Отредактированное объявление маршрута:

router.route('/test')
.post(client.test, client.returnDb);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...