抛出错误时未处理的 'error' 事件

Unhandled 'error' event when trowing error

我有以下用于在我的应用程序中创建用户的功能,我正在尝试检测是否已经创建了管理员用户并阻止创建另一个用户。

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

我以不恰当的方式抛出错误?是什么导致第一次投掷没有崩溃但第二次没有?

提前感谢您的帮助

首先,检查 'user' variable.If 的类型是数组还是对象,if(user){....} 将始终 return 为真,即使它是空的。并尝试添加

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

事件侦听器

您在 User.findOne 回调中异步抛出。这会崩溃。

相反,查看您正在使用的库,它为您提供 User.findOne 并查看它是否可以 return 一个承诺,或者如果没有,则将其包装在 bluebird 的 Promise.promisify 中' t.

这是您要到达的代码:

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