Промежуточное программное обеспечение Express error без `next ()`? - PullRequest
0 голосов
/ 24 октября 2019

Я использую Express и хочу использовать встроенное промежуточное ПО для обработки ошибок.

Я использую его таким образом -

app.use((err,req,res,next)=> {
    console.log('error');
)};

Теперь это промежуточное ПО достигнутотолько если я использую next(error) (где error - это объект типа Error) в моем маршрутизаторе. С другой стороны, если я просто throw new Error() в своем маршрутизаторе, промежуточное программное обеспечение не вызывается.

Есть ли способ пропустить next()? Так что, если в моем маршрутизаторе возникнет какая-либо ошибка, она будет обработана промежуточным программным обеспечением?

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Если вы можете использовать Node.js> = 8, поставляемый с async/await, тогда вы можете использовать следующую функцию-оболочку для ваших маршрутов:

const wrap = fn => {
  return async function(req, res, next) {
    let e = null;
    try {
      await fn(req, res, next);
    } catch (err) {
      e = err;
      next(err);
    }

    if (!e) {
      next();
    }
  };
};

    app.get(
      "/path",
      wrap(async (req, res) => {
        // use sync style code here which can throw
      })
    );
0 голосов
/ 24 октября 2019

Если выброс выполняется синхронно, вы можете изобрести свой собственный обработчик запросов, который будет перехватывать любые исключения и превращать их в вызов next():

app.get2 = function(path, fn) {
    app.get(path, function(req, res, next) {
        try {
            fn(req, res, next);
        } catch(err) {
            next(err);
        }
    });
};

И пример использования:

app.get2("/test", function(req, res, next) {
    throw new Error("testing...");    // will end up in next()
});

Тогда, если ваша fn функция генерирует синхронно, она будет перехвачена вашей get2() оболочкой и автоматически вызовет next(err) для вас.

Если вы выполняете асинхронный бросокэто не сработает. Не существует универсальной оболочки для асинхронных бросков, потому что броски в асинхронный обратный вызов не бросают в ваш код - они отбрасывают обратно в асинхронную инфраструктуру для любой асинхронной операции, которую вы использовали, и только они могут ее перехватить. Если вы используете обещания исключительно для асинхронных операций, то инфраструктура обещаний автоматически поймает ваши броски и превратит их в отклоненные обещания, и вы могли бы сделать что-то подобное выше для возвращенного и отклоненного обещания. Платформа Koa (производная от Express) уже делает нечто подобное, и я думаю, что Express 5 будет иметь некоторые функции, подобные этим.

...