Node.js mysql模块中的MySQL用户定义变量

时间:2019-01-09 14:49:02

标签: mysql node.js

我想知道MySQL用户定义的变量是否可以使用Node.js mysql模块工作。下面的示例恰好突出了我要使用事务实现的目标:

connection.beginTransaction(err => {
    if (err) { throw err; }

    connection.query('INSERT INTO user SET = ?', {id: 12, username: 'name'}, (err, results) => {
        if (err) {
            return connection.rollback(function() {
                throw error;
            });
        }

        connection.query('SELECT @user_id:=userID FROM user WHERE username = ?', ['name'], (err, results) => {
            if (err) {
                return connection.rollback(function() {
                    throw error;
                });
            }

            connection.query('INSERT INTO authentication SET `userID` = @user_id, ?', {password: 'userpassword'}, (err, results) => {
                if (err) {
                    return connection.rollback(function() {
                        throw error;
                    });
                }

                connection.commit(err => {
                    if (err) {
                        return connection.rollback(function() {
                            throw err;
                        });
                    }

                    console.log('success!');
                });
            });
        });
    });
});

您可能想知道,为什么不在第三个查询中使用第二个查询的结果。事务函数包装在实用程序函数中,该函数接受查询作为要使用事务执行的参数。

如果上面的代码示例不起作用,请采用一种简洁的方法来实现。谢谢。

1 个答案:

答案 0 :(得分:0)

运行代码示例后,它失败不是由于第二个查询中的MySQL变量。此代码示例对我有效:

connection.beginTransaction(err => {
    if (err) { throw err; }

    connection.query('INSERT INTO user (id, username) VALUES(?, ?)', [12, 'name'], (err, results) => {
        if (err) {
            return connection.rollback(function() {
               throw error;
            });
        }

        connection.query('SELECT @user_id:=userID FROM user WHERE username = ?', ['name'], (err, results) => {
            if (err) {
                return connection.rollback(function() {
                    throw error;
                });
            }

            connection.query('INSERT INTO authentication (id, password) VALUES (@user_id, ?), ['userpassword'], (err, results) => {
                if (err) {
                    return connection.rollback(function() {
                        throw error;
                    });
                }

                connection.commit(err => {
                    if (err) {
                        return connection.rollback(function() {
                            throw err;
                        });
                    }

                    console.log('success!');
                });
            });
        });
    });
});