0

我试图在以下语法中引发错误:

  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'
4

2 回答 2

1

throw 语句引发用户定义的异常。您的函数的执行将停止,从此时起不会执行任何操作。

有关 throw 关键字的帮助,请参阅网站。还要花时间阅读有关throw new Error的信息,因为这可能是您需要的,而不是 throw。这个链接也可能有帮助

就错误发生的原因而言,MySQL 错误告诉您正在将重复数据插入用户表中。数据库拒绝它,因为表中已经存在昵称值为“test4”的记录......因此,您不允许将另一个昵称为“test4”的用户插入表中。

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

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

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

祝你好运,编码愉快。

于 2019-03-04T10:07:50.657 回答
0

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

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'"
    }
}
于 2019-03-04T13:11:37.663 回答