Как мне ответить на ошибку в обещании при отправке смс через Twilio? - PullRequest
0 голосов
/ 25 сентября 2019

Я создал небольшой API-интерфейс nodejs, который принимает телефонный номер в качестве ввода, отправляет пользователю текст подтверждения через Twilio, а затем создает нового пользователя.Я звоню Twilio, чтобы отправить текстовое сообщение в функции ниже:

module.exports = function (recipient, message) {

    client.messages
        .create({
            body: message,
            from: '+16468464111',
            to: recipient
        })
        .then(message => {
            winston.info('Sent invite to ' + recipient + ' with SID ' + message.sid);
        })
        .catch(error => {
            winston.error(error);
        });

}

И затем я вызываю эту функцию из моего экспресс-маршрута следующим образом:

router.post('/', async (req, res) => {
  const { error } = validate(req.body); 
  if (error) return res.status(400).send(error.details[0].message);

  let user = await User.findOne({ phone: req.body.phone });
  if (user) return res.status(400).send('Number already used')

  user = new User(_.pick(req.body, ['phone']));

  const activationUrl = 'https://www.thebeep.app/activate/' + user._id;
  const message = 'Welcome to The Beep! To activate your account and create your username click here: ' + activationUrl;
  const phone = '+1' + user.phone;

  const sms = await twilio(phone, message);

  try {
    user = await user.save();
    res.send(user);
  } catch (ex) {
    res.status(400).send('Invalid number ' + ex);
  }

});

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

Спасибо,

Эван

1 Ответ

1 голос
/ 25 сентября 2019

Предполагая, что twilio - это функция в первом блоке кода, просто верните значение client.messages.create().Так как вы в любом случае используете async / await, сделайте функцию также асинхронной:

module.exports = async (recipient, message) => {
  try {
    const message = await client.messages.create({ ... })
    winston.info('Sent invite to ' + recipient + ' with SID ' + message.sid) 
    return message  
  } catch (e) {
    winston.error(e);

    // re-throw so that the route's try-catch can also capture it.
    throw e;
  } 
}

Затем поместите ваш вызов twilio в try-catch

try {
  // Should this line throw, user.save() will not be called.
  const sms = await twilio(phone, message);
  user = await user.save();
  res.send(user);
} catch (ex) {
  res.status(400).send('Invalid number ' + ex);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...