2016-10-19 6 views
0

У меня есть следующая функция для создания пользователя в моем приложении, я пытаюсь определить, создан ли пользователь, созданный пользователем, и не создавая другого.Событие с ошибкой «ошибка» при ошибке опрокидывания

export async function createUser (ctx) { 
    if (ctx.request.body.type == undefined ) { 
     ctx.throw(400, 'Bad Request') 
    } 
    if (ctx.request.body.type === 'admin') { 
    User.findOne({type:'admin'}, (err, usr) => { 
     if (err) 
     ctx.throw(422, err.message) 
     if (usr){ 
     ctx.throw(400, 'Duplicate Admin') 
     } 
    }) 
    } 
.... 

Первые ctx.throw(400, 'Bad Request') работы, но если другой администратор найден ctx.throw(400, 'Duplicate Admin') вызовет следующую ошибку, сбой приложения:

events.js:160 
     throw er; // Unhandled 'error' event 
    ^

BadRequestError: Duplicate Admin 

Я бросал ошибку в неадекватной форме? что заставляет первый бросок работать без сбоев, но не второй?

Заранее спасибо за любую помощь

ответ

0

Вы бросаете асинхронно внутри User.findOne обратного вызова. Это сбой.

Вместо этого посмотрите на библиотеку, которую вы используете, которая дает вам User.findOne и посмотрит, может ли она вернуть обещание или обернуть ее в Promise.promisify bluebird, если это не так.

Это код, который вы хотите, чтобы прибыть по адресу:

const user = await User.findOne({ type: 'admin' }) // returns a promise 
if (user) ctx.throw(400, 'Duplicate admin') 
0

На первом, проверьте тип «пользователя» variable.If ему массив или объект, if(user){....} всегда возвращает истину, даже если он пуст. А попробуйте добавить

app.on('error', function() { 
    console.log('yep this is an error'); 
}); 

прослушиватель событий

 Смежные вопросы

  • Нет связанных вопросов^_^