【问题标题】:How to handle a MySQL node query?如何处理 MySQL 节点查询?
【发布时间】:2020-07-06 05:22:42
【问题描述】:

在 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)

【问题讨论】:

  • 你能显示完整的错误信息吗?
  • @nbk 绝对!我刚刚更新了问题
  • 您的字段用户名是 UNIQUE 或 Primnary KEY,并且只允许其中一种。您必须发现错误并告诉用户输入另一个无用户名/电子邮件或启动忘记密码例程
  • 我明白,但即使我将它包裹在 try-catch 中,它仍然坏了。
  • 当您在尝试中收到 ER_DUP_ENTRY 作为错误时,捕获重定向以输入新用户名(或您想要的 eve4r,因此它应该类似于 stackoverflow.com/questions/49004109/…

标签: mysql node.js callback


【解决方案1】:

由于您已经在代码的相关部分包裹了一个 try-catch 并且仍然存在崩溃,因此可以安全地假设崩溃发生在 catch 内部,即从 @ 抛出异常987654322@ 块,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 之间发生的变化。

【讨论】:

    猜你喜欢
    • 2017-12-23
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2017-08-21
    • 2012-07-05
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    相关资源
    最近更新 更多