Как обработать ошибку в Express Passport deserializeUser - PullRequest
0 голосов
/ 11 октября 2018

Как передать ошибку из passport.deserializeUser в промежуточное программное обеспечение для обработки ошибок, а затем запустить req.logout для выхода из системы?

passport.deserializeUser((id, done) => {
  Family.findById(id).then(family => {
    done(null, family);
  });
});

Ошибка:

[0] (node:28528) UnhandledPromiseRejectionWarning: CastError: Cast to ObjectId failed for value "abc123" at path "_id" for model "families"
[0]     at new CastError (/xxxx/server/node_modules/mongoose/lib/error/cast.js:29:11)
[0]     at ObjectId.cast (/xxxx/server/node_modules/mongoose/lib/schema/objectid.js:158:13)
[0]     at ObjectId.SchemaType.applySetters (/xxxx/server/node_modules/mongoose/lib/schematype.js:724:12)
[0]     at ObjectId.SchemaType._castForQuery (/xxxx/server/node_modules/mongoose/lib/schematype.js:1113:15)
[0]     at ObjectId.SchemaType.castForQuery (//xxxx/node_modules/mongoose/lib/schematype.js:1103:15)
[0]     at ObjectId.SchemaType.castForQueryWrapper (/xxxx/server/node_modules/mongoose/lib/schematype.js:1082:15)
[0]     at cast (/xxxx/server/node_modules/mongoose/lib/cast.js:303:32)
[0]     at model.Query.Query.cast (/xxxx/server/node_modules/mongoose/lib/query.js:3524:12)
[0]     at model.Query.Query._castConditions (/xxxx/server/node_modules/mongoose/lib/query.js:1392:10)
[0]     at model.Query.Query._findOne (/xxxx/server/node_modules/mongoose/lib/query.js:1624:8)
[0]     at process.nextTick (/xxxx/server/node_modules/kareem/index.js:333:33)
[0]     at process._tickCallback (internal/process/next_tick.js:150:11)

1 Ответ

0 голосов
/ 11 октября 2018

Решенная проблема:

Перехватите ошибку Mongoose в deserializeUser и отправьте ошибку в промежуточное ПО:

passport.deserializeUser((id, done) => {
  Family.findById(id)
    .then(family => {
      done(null, family);
    })
    .catch(error => {
      done(error);
    });
});

Обработайте ошибку в промежуточном программном обеспечении обработки ошибок через эти последние строки index.js:

[...]
app.use(require('./middlewares/errorHandler_Final'));
app.listen(5000);

Определение промежуточного ПО для настраиваемой ошибки: errorHandler_Final.js

module.exports = (err, req, res, next) => {
  if (res.headersSent) {
    console.log('HEADERS ALREADY SENT');
    return next(err);
  }
  if (err.name === 'CastError') {
    // specifically handles that error. In my case, 
    // if session id gets corrupted, delete the cookie from client browser.
    // req.logout alone was not enough.
    // NB the cookie had been created by cookie-session
    req.session = null;
    req.logout;
    return res.sendStatus(500);
  }
  return res.sendStatus(err.status || 500);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...