mysql - 我用 try-catch 块包裹,但应用程序崩溃了
问题描述
我试图在以下语法中引发错误:
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 语句引发用户定义的异常。您的函数的执行将停止,从此时起不会执行任何操作。
有关 throw 关键字的帮助,请参阅此网站。还要花时间阅读有关throw new Error的信息,因为这可能是您需要的,而不是 throw。这个链接也可能有帮助
就错误发生的原因而言,MySQL 错误告诉您正在将重复数据插入用户表中。数据库拒绝它,因为表中已经存在昵称值为“test4”的记录......因此,您不允许将另一个昵称为“test4”的用户插入表中。
为什么你可能会问?这是因为您在表上有一个索引,要求昵称是唯一的。
您可以使用的两个选项如下:
- 向您的 javascript 添加更多代码,告诉您的用户如果昵称已被其他用户使用,请请求他们选择另一个昵称并重试。
- 如果您希望允许多次插入相同的昵称,请通过删除表上的唯一昵称要求来允许重复的昵称。为此,您需要修改表上的索引。如果您的其他表字段没有唯一值,这可能很危险且不适合。
祝你好运,编码愉快。
推荐阅读
- python - 如何创建大小可调的字段?
- angular - 延迟加载完成后,Angular canDeactivate 方法正在触发
- android - 如何在android中处理应用程序窗口的最小化事件(redmi note 6 pro)
- apache-kafka - 使用 Kafka Mirror Maker 的 Apache Kafka 原子事务?
- wordpress - wp_redirect 进入无限循环
- java - 非法文本块打开分隔符序列,缺少行终止符
- html - 阻止 Safari 共享规范网址
- javafx - 如何在javafx中将文本字段输入更改为仅数字?
- git - 如何解决 Git 致命错误“松散的目标文件”:文件描述符错误?
- javascript - 使用 ws npm 库创建 wss 套接字 - 错误:套接字挂起