В настоящее время я тестирую, как какой-то код стоит против следующего сценария:
- Node.js запущено и успешно устанавливает соединение с mongodb
- После успешной установки соединения сервер mongodb умирает и все последующие запросы терпят неудачу
Для этого у меня есть следующий код, который использует официальный драйвер (здесь: https://github.com/mongodb/node-mongodb-native):
MongoClient.connect('mongodb://localhost:27017/testdb', function(err, db) {
app.get('/test', function(req, res) {
db.collection('users', function (err, collection) {
console.log(err);
if (err) {
// ## POINT 1 ##
// Handle the error
}
else {
collection.find({ 'username': username }, { timeout: true }).toArray(function(err, items) {
console.log(err);
if (err) {
// ## POINT 2 ##
// Handle the error
}
else {
if (items.length > 0) {
// Do some stuff with the document that was found
}
else {
// Handle not finding the document
}
}
});
}
});
});
});
Поскольку сервер mongodb больше не работает при обработке запроса, я сделал предположение, что в тех точках, которые я обозначил ## POINT 1 ## или ## POINT 2 ##, он вернется ошибка, указывающая таймаут; это, однако, не так.
Я попробовал несколько различных настроек (в том числе тот, который вы видите здесь, который явно позволяет курсору на время ожидания), однако я никак не могу его включить. В каждой конфигурации, которую я пробовал Node.js, просто будет ждать, пока операция find() вернется к обратному вызову, и она никогда этого не сделает.
Если я запустил приложение Node.js перед запуском mongodb, он поймал ошибку в правильном обратном вызове соединения, но если соединение замирает после этого, оно никак не обрабатывает его.
Есть ли параметр, который у меня отсутствует, или нет способа обнаружить, что соединения завершаются после того, как они были установлены?
Изменить: просто чтобы быть ясным, переменная имени пользователя, используемая в методе поиска, фактически объявлена в моем полном коде, код, который я поставил в этом сообщении, является сокращенной версией, чтобы проиллюстрировать структуру и проверку ошибок.