Получение 'UnhandledPromiseRejectionWarning' при использовании поля 'store' в экспресс-сессии - PullRequest
0 голосов
/ 21 мая 2019

Я использую «экспресс-сессию», чтобы включить постоянный вход на моем сайте. Все работает отлично, но когда я использую внешнюю базу данных для хранения файлов cookie, я получаю следующее предупреждение: (node:6084) UnhandledPromiseRejectionWarning (node:6084) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:6084) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process wit h a non-zero exit code.

Я сузил его до связи с полем store в объекте session. Ниже вы увидите код моего app.use(session{...}). Если я удаляю поле store из этого объекта JSON, по умолчанию используется MemoryStore, и вышеприведенное предупреждение не выдается. Я использую IBM Cloudant DB, которая отлично взаимодействует и сохраняет данные сеанса, как и ожидалось. Проблема заключается в том, что выше выдается предупреждение.

// Works, but warning is thrown
app.use(session({
    store: store, // Use the IBM Cloudant database as a store.
    resave: true, // Store sessions back to the store if they were never modified. 
    saveUninitialized: true, // Save any uninitialized or new sessions that have no data.
    secret: SESSION_SECRET,
    cookie: {
        maxAge: 1000 * 60 * 60 * 2,
        secure: true
    }
}));

// Works with no warning being thrown.
app.use(session({
    resave: true, // Store sessions back to the store if they were never modified. 
    saveUninitialized: true, // Save any uninitialized or new sessions that have no data.
    secret: SESSION_SECRET,
    cookie: {
        maxAge: 1000 * 60 * 60 * 2,
        secure: true
    }
}));

Вот моя установка Cloudant, она отлично работает и всегда возвращает Session connected, потому что она правильно подключается.

// Create the session storage object to store cookies.
const store = new CloudantStore({
    url: CLOUDANT_DB_URL,
    database: DB_NAME
});

// Inform us that the session is connected to the cloudant database.
store.on('connect', () => console.log('Session connected'));
// Inform us that the session disconnected from the cloudant database.
store.on('disconnect', () => console.log('Session disconnected.'));
// Inform us that the session failed to connect to the cloudant database.
store.on('error', (err) => console.log(err.msg));

Ожидаемый результат - сессия будет работать без выдачи вышеуказанного предупреждения.

1 Ответ

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

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

Ошибка в том, что обещание написано без уловки. Если вы новичок в обещаниях, я предлагаю вам сначала прочитать, как они работают.

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

Некоторые кодеры исключают .catch () из обещания, которое они никогда не ожидают, что потерпят неудачу. Это не очень хорошая практика, и в будущих версиях Node это предотвратит запуск кода с обещаниями, пропускающими перехват. Пока все в порядке, но вы должны выяснить, какая библиотека вызывает эту ошибку, и предупредить автора, чтобы она могла быть обновлена.

Если вы хотите исправить это самостоятельно, просто добавьте:

.catch((error)=>{console.log("The promise failed! error: "+error)})

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

...