Node.js与MySQL同步查询

时间:2015-09-29 17:18:51

标签: mysql node.js

我正在为我正在处理的网站创建用户注册系统,但我遇到了一些问题。

我试图远离不得不嵌套回调因为它有点混乱,我需要帮助的是找到是否有办法用node-mysql创建同步查询

这是我想要实现的目标。

connection.query("select 1 as email from users where email = " + connection.escape(email), function(err, rows, fields) {
    if(err) {
        var error = {
            error_message: err.code,
            error_number: err.errno
        };

        return res.send(error);
    }

    if(rows.length > 0) {
        var error = {
            message: 'Email Address is Taken',
            code: 2
        };
        return res.send(error);
    }
});

connection.query("insert into users (email, password) values ("+connection.escape(email)+", "+connection.escape(hash)+")", function(err, rows, fields) {
            if(err) {
                var error = {
                    error_message: err.code,
                    error_number: err.errno
                };

                return res.send(error);
            }
        });

我的目标是运行第一个查询,如果返回一行,则不执行第二个查询,但如果第一个查询返回0行,则继续并运行第二个查询。

我知道我可以在第一个查询中嵌入第二个查询并将if放在else中但是我不想做的事情因为虽然我有这两个查询但我也设置了它使用bcrypt来加密必须嵌套的密码。

有没有办法写它,以便我不需要嵌套这两个查询或嵌套它们将是我唯一的选择?

6 个答案:

答案 0 :(得分:14)

您可以简单地将模块用于提供同步功能的节点。 在这里,您将找到一个提供同步/异步功能来处理mysql的模块。

https://github.com/Will-I4M/node-mysql-libmysqlclient

以下是如何使用它来执行同步查询:

var config = require("./config.json") ;
var mysql = require('mysql-libmysqlclient') ;
var client = mysql.createConnectionSync(config.host, config.user, config.password, config.database) ;

var query = "SELECT * FROM Users ;" ;
var handle = client.querySync(query) ;
var results = handle.fetchAllSync() ;

console.log(JSON.stringify(results)) ; 

答案 1 :(得分:12)

正如jfriend00所说,如果你要在node.js中开发,那么你必须习惯于编写异步代码。

"链接承诺"可能是你最好的选择:

附录:

本教程说明使用node.js SQL查询进行链接的承诺。它还讨论了如何使用Q和/或Step来简化代码:

答案 2 :(得分:0)

对于我在node.js中编码的大多数事情,我喜欢异步代码。但是,我完全理解异步代码与编写和维护业务逻辑的需求极其危险地不兼容。我使用了各种替代方法。使事物同步的模块仍然会让您遇到使事情复杂化的数据范围问题。承诺最适合我。使用这种方法,我发现自己几乎在JavaScript之上编写了一种新语言的解释器。我可能看起来很荒谬,但最实用和最安全的方法最终是使用shelljs模块和mysql shell客户端。这不是很好的执行性能,但它可以提高开发人员的性能,并保持业务逻辑的清晰和有序,这对于业务逻辑至关重要。这里有一些代码片段,给出了我创建的一些例子:

var shell = require('shelljs');

module.exports = {
    user: '',
    password: '',

    runSql: function (sql) {
        var command = "echo '" + sql.replace(/'/g, "'\\''") + "' | mysql -u" + this.user.replace(/'/g, "'\\''") + " -p'" + this.password.replace(/'/g, "'\\''") + "'";
        var raw = shell.exec(command, {silent: true}).stdout;
        //console.log( 'BASH -> MySQL YIELD: "' + raw + '"' );
        if (raw.substr(0, 5) === 'ERROR') {
            console.log('ERROR Resulting from: ' + sql + '\n' + raw);
            return [];
        }
        var rows = raw.split('\n');
        var names = [];
        for (var r = 0; r < rows.length; r += 1) {
            columns = rows[r].split('\t');

            // Capture column names
            if (r === 0) {
                names = columns;
                continue;
            }

            // Reformat row into named valued
            var fields = {};
            for (var c = 0; c < columns.length; c += 1) {
                fields[names[c]] = columns[c];
            }
            rows[r] = fields;
        }

        // Eliminate extraneous first and last rows
        rows.splice(0, 1);
        rows.splice(rows.length - 1, 1);

        return rows;
    },

}

答案 3 :(得分:0)

在某些情况下,您需要同步查询(或至少出于可读性或简便性)。我不同意必须以异步方式在node.js上完成所有事情。

我已经测试了很多可用的解决方案,并最终使用了“ sync-mysql”模块(https://github.com/ForbesLindesay/sync-mysql)。

易于安装和使用,但性能却不那么好(特别是如果您必须执行很多子查询)。

答案 4 :(得分:0)

我知道我参加这次聚会很晚,但是我觉得我可以帮助像我这样需要同步使用MySQL的人。

答案是here

哦,我不得不添加一个pool.end();在我的查询代码关闭连接并停止无限等待循环之后。参见here

答案 5 :(得分:0)

我能找到的最简单的解决方案是sync-sql模块。 安装所需的模块

npm install sync-sql
npm install sync-mysql 

样本index.js

const Mysql = require('sync-mysql') 


const connection = new Mysql({ 
    host:'localhost', 
    user:'root', 
    password:'password', 
    database:'demo'
}) 
  
var result = connection.query('SELECT NOW()') 
console.log(result) 

https://www.geeksforgeeks.org/how-to-run-synchronous-queries-using-sync-sql-module-in-node-js/