Если эта строка отклоняет:
client = await mongoClient.connect(url);
Затем вы переходите к блоку catch
и после этого блока перехвата вызываете client.close()
.Но client
- это undefined
, поэтому client.close()
бросит, и вы не находитесь внутри try/catch
в этот момент.Поскольку вы находитесь внутри функции async
, этот бросок превратится в отклоненное обещание, с которым у вас нет .catch()
обработки.Таким образом, вы получите необработанное отклонение обещания.
Вы сможете исправить это следующим образом:
function router(nav) {
adminRouter.route('/').get(async (req, res) => {
const url = 'mongodb://localhost:27017';
const dbName = 'libraryApp';
let client;
try {
client = await mongoClient.connect(url);
debug('Connected correctly to server');
const db = client.db(dbName);
const response = await db.collection('books').insertMany(books);
res.json(response);
} catch (err) {
debug(err.stack);
// make sure and send some response on errors
res.sendStatus(500);
}
if (client) {
client.close();
}
});
return adminRouter;
}
Это вносит несколько изменений:
- Добавьте
if (client)
перед вызовом client.close()
, чтобы защитить его от случая, когда `клиент никогда не был установлен. - Сделайте весь
.get()
обратный вызов равным async
вместо использования IIFE (не требуется, просто кажетсячище мне) - Отправьте сообщение об ошибке и ответ в своем заявлении
catch
, чтобы вы всегда отправляли какой-либо http-ответ, даже в ситуациях с ошибкой.
Если вы действительно хотите быть отказоустойчивым, вы можете просто добавить еще одну попытку / поймать:
function router(nav) {
adminRouter.route('/').get(async (req, res) => {
const url = 'mongodb://localhost:27017';
const dbName = 'libraryApp';
let client;
try {
client = await mongoClient.connect(url);
debug('Connected correctly to server');
const db = client.db(dbName);
const response = await db.collection('books').insertMany(books);
res.json(response);
} catch (err) {
debug(err.stack);
// make sure and send some response on errors
res.sendStatus(500);
}
try {
if (client) {
client.close();
}
} catch(e) {
console.log("unable to close database connection");
}
});
return adminRouter;
}