mysql - 如何处理 MySQL 节点查询?
问题描述
在 Node JS 中运行 MySQL 查询时,我试图处理 dup key 错误。我尝试将呼叫包装在 try-catch 中,但仍然存在崩溃。我还将 create 调用包装在 try-catch 中,但没有运气。有谁可以处理这个崩溃?
create(first_name, last_name, username, email, password, callback) {
let salt = bcrypt.genSaltSync(SALT_ROUNDS);
let hash = bcrypt.hashSync(password, salt);
let sql = `INSERT INTO users (username, email, first_name, last_name, password) VALUES (?, ?, ?, ?, ?);`;
let values = [
username.toLowerCase(), email.toLowerCase(),
first_name.toLowerCase(), last_name.toLowerCase(),
hash
];
// Crash below
try {
db.query(sql, values, (error, results) => {
if (error) {
return callback(error, undefined);
}
return callback(undefined, results.insertId)
});
} catch (error) {
callback(error, undefined)
}
}
NodeJs 路由调用:
Users.create(first_name, last_name, username, email, password, (error, insertedId) => {
if (error) {
next(error);
}
..
}
错误:
Database connected...
Error: ER_DUP_ENTRY: Duplicate entry 'test-test@gmail.com' for key 'username'
at Query.Sequence._packetToError (C:\Users\main\development\hvz-api\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14)
at Query.ErrorPacket (C:\Users\main\development\hvz-api\node_modules\mysql\lib\protocol\sequences\Query.js:79:18)
at Protocol._parsePacket (C:\Users\main\development\hvz-api\node_modules\mysql\lib\protocol\Protocol.js:291:23)
at Parser._parsePacket (C:\Users\main\development\hvz-api\node_modules\mysql\lib\protocol\Parser.js:433:10)
at Parser.write (C:\Users\main\development\hvz-api\node_modules\mysql\lib\protocol\Parser.js:43:10)
at Protocol.write (C:\Users\main\development\hvz-api\node_modules\mysql\lib\protocol\Protocol.js:38:16)
at Socket.<anonymous> (C:\Users\main\development\hvz-api\node_modules\mysql\lib\Connection.js:88:28)
at Socket.<anonymous> (C:\Users\main\development\hvz-api\node_modules\mysql\lib\Connection.js:526:10)
at Socket.emit (events.js:223:5)
at addChunk (_stream_readable.js:309:12)
..
..
C:\Users\main\development\hvz-api\node_modules\mysql\lib\protocol\Parser.js:437
throw err; // Rethrow non-MySQL errors
^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:485:11)
at ServerResponse.header (C:\Users\main\development\hvz-api\node_modules\express\lib\response.js:767:10)
at ServerResponse.send (C:\Users\main\development\hvz-api\node_modules\express\lib\response.js:170:12)
at ServerResponse.json (C:\Users\main\development\hvz-api\node_modules\express\lib\response.js:267:15)
解决方案
由于您已经在代码的相关部分周围包裹了一个 try-catch 并且仍然存在崩溃,因此可以安全地假设崩溃发生在 内部,也就是说,从块catch
中抛出异常,块捕获它并然后在你的块内发生了一些事情,这引发了另一个异常。你可以通过临时注释掉里面的代码来试试我的理论,只是为了好玩:try
catch
catch
catch
try {
db.query(sql, values, (error, results) => {
if (error) {
return callback(error, undefined);
}
return callback(undefined, results.insertId)
});
} catch (error) {
//callback(error, undefined)
}
如果它现在没有抛出异常,那么您对回调的调用会引发错误,您将需要更改您的代码catch
以使其正常失败。
但这只是技术解决方案。从概念上讲,您甚至不应该运行insert
可能无效的。您应该执行验证检查,如果一切正常,则运行insert
. 你仍然需要一个 try-catch 和一个适当的错误处理来处理你的验证检查和你的insert
虽然之间发生的变化。
推荐阅读
- android - 在 Flutter WebView 中检查连接并强制刷新
- html - 如何以较低的字体显示子菜单内容?
- spring-boot - Spring Boot 找不到 EmbeddedKafkaBroker Bean(不使用 SpringbootTest)
- swift - PDF视图不滚动
- html - 如何在下拉菜单外部单击时以 8 角捕获引导下拉关闭事件
- python - 如何解决 ValueError:int() 以 10 为基数的无效文字:'1.81'?
- java - 错误:找不到符号类 FirebaseInstanceIdService
- javascript - 移动到 React Native 中的选定页面
- java - Docker,RabbitMQ 接收器获取 java.net.ConnectException: Connection Refused
- image-processing - 有人可以向我解释给定 github 链接中使用的“局部最大值”方法吗?