Axios + Sequelize ValidationError = нет объектов запросов или ответов в блоке обещаний?Как справиться? - PullRequest
0 голосов
/ 11 октября 2018

Как правило, у меня есть вызовы Axios, которые выглядят примерно так:

api.post('/users/add', (req, res, next) => {
  Users.create(req.body).then(userResult => {
    // misc code here
    return res.json(userResult)
  }).catch((err, req, res, next) => {
    if (err) {
      // handle the error by sending to the application error handler
      next(err);
    }
  });
});

Проблема, с которой я столкнулся, заключается в том, что req, res и next, по-видимому, не существуют, если ошибка является проверкой Sequelizeошибка.Поэтому я добавляю проверку в IF следующим образом:

if (err) {
  if (err instanceof Sequelize.ValidationError) {
    // i've tried a lot here and am stuck as to what to do
  } else {
    // handle other errors
  }
}

Я могу точно проверить ошибку, как только попал в этот внутренний IF, но я не знаю, что делать, чтобы получить ответк вызывающему браузеру.Я также не могу вызвать next () и вызвать ошибку в моем обычном обработчике ошибок, так как он не распознает next ().И если бы я мог, то элементы, которые я обычно использую из req или res, недоступны.

Я просмотрел всю документацию на веб-сайте Sequelize, изучил очередь вопросов, искал здесь в stackoverflow,и не могу найти ту же проблему.Поэтому я полагаю, что решение является чем-то простым, что является лишь пробелом в моих знаниях.Пожалуйста, просветите меня.Как мне заставить это всплыть в моем общем обработчике ошибок или вернуть ответ браузеру отсюда?

1 Ответ

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

Вы не должны переопределять req, res и next в улове.Они будут доступны из родительской области видимости, но при включении их в catch они будут неопределенными, так как затем / catch будет иметь только один аргумент.

/* create a POST route. for /users/add requests it will 
   call a function passing in req, res, next() */
api.post('/users/add', (req, res, next) => { // this syntax creates an "arrow function"
  /* note that it's probably a bad idea to just 
     pass in the request.body without sanitizing */
  return Users.create(req.body)    // call Sequelize and get a Promise
    .then((userResult) => {        // success, userResult will be the new user
      return res.json(userResult); // use res.json() to send to client
    })
    .catch((err) => {              // create failed
      return next(err);            // pass the err along to next()
    });
});

Если вы хотите написать тот же код с async/await, который позволяет писать асинхронный код в синхронном синтаксисе.Когда вы добавляете async, функция автоматически возвращает обещание.Использование await будет ожидать разрешения Promise (или выдачи ошибки), не переходя в ад с отступами (в данном случае это результат создания пользователя).

api.post('/users/add', async (req, res, next) => {
  try {
    const user = await Users.create(req.body);
    return res.json(userResult);
  } catch (err) {
    return next(err);
  }
});
...