Я завернул блок try-catch, но приложение упало - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь выдать ошибку в следующем синтаксисе:

  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'

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Я обнаружил, что не могу выдавать ошибки в асинхронной функции, поэтому я попытался использовать обратный вызов.

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'"
    }
}
0 голосов
/ 04 марта 2019

Оператор throw генерирует пользовательское исключение.Выполнение вашей функции остановит , и с этого момента ничего не будет выполнено.

См. этот веб-сайт для получения справки по ключевому слову throw.Также найдите время, чтобы прочитать о throw new Error , так как это может быть то, что вам нужно вместо throw.Эта ссылка также может помочь

С точки зрения причины возникновения ошибки, MySQL сообщает вам, что вы вставляете дубликаты данных в таблицу пользователей.База данных отклоняет его, потому что в таблице уже существует запись со значением псевдонима 'test4' в таблице .... Таким образом, вы не можете вставить в таблицу другого пользователя с таким же псевдонимом 'test4'.

Почему вы можете спросить?Это потому, что у вас есть индекс в таблице, который требует, чтобы псевдоним был уникальным.

Можно использовать следующие два варианта:

  1. Добавить дополнительный код для васjavascript сообщает вашему пользователю, что если псевдоним уже занят другим пользователем, попросите его выбрать другой псевдоним и повторите попытку.
  2. Разрешите дублировать псевдонимы, удалив требование уникального псевдонима в таблице, если вы хотите разрешить этот псевдонимбыть вставленным более одного раза.Для этого вам нужно изменить индекс в таблице.Это может быть опасно и не подходит, если другие поля вашей таблицы не имеют уникального значения.

Удачи и удачного кодирования.

...