我用 try-catch 块包装但应用程序崩溃了

I wrapped with try-catch block but app crashed

我试图在以下语法中抛出错误:

  if(err) throw err

我期望的是按 "console.log(err)" 行打印日志,而不是应用程序崩溃。

但是,这会发生错误,应用程序崩溃并显示

throw err; // Rethrow non-MySQL errors
        ^

Error: Error: ER_DUP_ENTRY: Duplicate entry 'test4' for key 'nickname_UNIQUE'

我不明白为什么会这样,需要专家的帮助。

代码:

 api.post('/', (req, res) => {
    const email = req.body.email
    const nickname = req.body.nickname
    const password = req.body.password
    const thumbnail = req.file
    const type = req.body.type

    const hasherCallback = (err, pass, salt, hash) => {
      if (err) throw err

      const sql = `INSERT INTO users set ?`
      const fields = { nickname, email, 'password': hash, salt, thumbnail, type }
      const queryCallback = (err) => {
        if (err) throw err

        return res.json(messages.SUCCESS_MSG)
      }

      conn.query(sql, fields, queryCallback)
    }
    try {
        return hasher({ password }, hasherCallback)
    } catch (err) {
      //handle errors here
      console.log(err)
    }
  })

  return api
}

//Error : Error: Error: ER_DUP_ENTRY: Duplicate entry 'test4' for key 'nickname_UNIQUE'

throw 语句抛出用户定义的异常。您的函数的执行 将停止 并且从此时开始不会执行任何操作。

参见this website for help on the throw keyword. Also take the time to read about the throw new Error as this might be what you need instead of throw. This link也可能有帮助

就错误发生的原因而言,MySQL 错误告诉您您正在向用户插入重复数据 table。数据库拒绝它,因为 table 中已经存在昵称值为 'test4' 的记录。...因此您不能插入另一个具有相同昵称 'test4' 的用户进入 table.

为什么你会问? 这是因为您在 table 上有一个索引,要求昵称是唯一的。

您可以使用以下两个选项:

  1. 向您添加更多代码 javascript 告诉您的用户如果昵称已被其他用户使用,请要求他们选择另一个昵称并重试。
  2. 如果您想允许多次插入相同的昵称,请通过删除 table 上的唯一昵称要求来允许重复的昵称。为此,您需要修改 table 上的索引。如果您的其他 table 字段没有唯一值,这可能是危险的而不是 suitable。

祝你好运,编码愉快。

我发现我不能在异步函数中抛出错误,所以我尝试使用回调。

api.post('/', (req, res) => {
    const email = req.body.email
    const nickname = req.body.nickname
    const password = req.body.password
    const thumbnail = req.file
    const type = req.body.type

    const errorHandle = (callback) => {
      const hasherCallback = (err, pass, salt, hash) => {
        if (err) return callback(err)

        const sql = `INSERT INTO users SET ?`
        const fields = { nickname, email, 'password': hash, salt, thumbnail, type }
        const queryCallback = (err) => {
          if (err) return callback(err)

          return res.json(messages.SUCCESS_MSG)
        }
        conn.query(sql, fields, queryCallback)
      }

      return hasher({ password }, hasherCallback)
    }

    return errorHandle((err) => {
      //This one equals console.log({ status: 'error' message: err })
      return res.status(500).json(messages.ERROR(err))
    })
  })

这会打印我想要的日志而不是应用程序崩溃。

 {
    "status": "error",
    "message": {
        "code": "ER_DUP_ENTRY",
        "errno": 1062,
        "sqlMessage": "Duplicate entry 'test4' for key 'nickname_UNIQUE'",
        "sqlState": "23000",
        "index": 0,
        "sql": "INSERT INTO users SET `nickname` = 'test4', `email` = 'test4@test.com', `password` = 'FXxSpPBNFfL1KGS0sWn19N191Hj0FXtnCWwMspneVIvwB5UgPBI0MjBskEnHby357j/3VKWM7ffi/5yD5CiIRyAGMWnTaStzbVX/hhD1/y91UW9b8etWpV5koKcn9QsmD9BozX1+wkve66lTNoFUHDWA0BDj4j8O7ltsD4698LQ=', `salt` = 'cu7GlOjK4drxV/SD4CBJtiW5yirc5/TpaAroCBbCQtOy4Asr8rGvTrxArXHmPH6ADTtHlXvUEEoeUD73LS654Q==', `thumbnail` = NULL, `type` = 'local'"
    }
}