Динамический статус ответа в экспресс-асинхронном / ожидающем обработчике ошибок - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу заменить цепочку обещаний в моей экспресс-маршрутизации на async / await.Это делает код чистым и более читабельным.Сначала посмотрите на мой код.

Что у меня было раньше:

app.post('/search', (req,res) => {
    sendRequest(req.body).then( searchDetails => {
        res.send(searchDetails);
    }).catch( error => {
        res.status(404).send(error)
    });
});

Текущий код:

app.post('/search', asyncMiddleware(async (req,res) => {
    const result = await sendRequest(req.body);
    res.send(result);
}));

А вот так выглядит asyncMiddleware:

const asyncMiddleware = checkedFunction => (req, res) => {
    Promise
        .resolve(
            checkedFunction(req, res)
        )
        .catch( error => {
            res.status(400).send(error)
        });
};

Проблема начинается, когда у меня есть маршрутизация, которая включает в себя более одного состояния ошибки.

app.delete('/delete/:id', authenticate, (req, res) => {
    const id = req.params.id;

    if (!ObjectID.isValid(id)) {
      return res.status(404).send();
    }

    User.findOneAndDelete({
        _id: id,
        _user: req.user._id
    }).then((todo) => {
      if (!todo) {
        return res.status(404).send();
      }

      res.send({todo});
    }).catch((e) => {
      res.status(400).send();
    });
});

Как я могу сделать так, чтобы asyncMiddleware вернул состояние, зависящее от ошибки?

1 Ответ

0 голосов
/ 14 февраля 2019

asyncMiddleware здесь проверяет, возникла ли какая-либо ошибка или была ли она намеренно выдана checkedFunction, а именно обработчиком экспресс-маршрута.Если вы хотите что-то сказать asyncMiddleware, вам нужно обернуть свой обработчик маршрута так же, как вы это делали для /search, тогда вам нужно выбросить конкретные ошибки / объекты, связанные с вашей информацией об ошибках:

app.delete('/delete/:id', authenticate, asyncMiddleware(async (req, res) => {
    const id = req.params.id;

    if (!ObjectID.isValid(id)) {
      throw {
          status: 404,
          message: 'id not valid'
      }
    }

    try {
        const todo = await User.findOneAndDelete({
            _id: id,
            _user: req.user._id
        });

        if (!todo) {
            throw {
                status: 404,
                message: 'todo not found'
            }
        }
        res.send({todo});
    } catch (e) {
        throw {
            status: 400,
            message: 'mongodb error'
        }
    }
}));

тогда asyncMiddleware может отправлять статус в ответ

const asyncMiddleware = checkedFunction => (req, res) => {
    Promise
        .resolve(
            checkedFunction(req, res)
        )
        .catch( error => {
            res.status(error.status).send(error.message)
        });
};

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...