Node.js与MySQL同步查询

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

我试图避免嵌套callback,因为它是一种混乱,我需要帮助是find是否有一种方法来创build同步查询与节点的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行,然后继续并运行第二个查询。

我知道我可以嵌套在第一个查询中的第二个查询,如果在其他的但是这就是我不想做的,因为当我有这两个查询我也有它设置你使用bcryptencryption密码也必须嵌套。

有没有一种方法来写它,使我不需要嵌套两个查询或嵌套他们将成为我唯一的select?

正如jfriend00上面所说,如果你打算在node.js中开发,那么你必须习惯编写asynchronous代码。

“链接承诺”可能是你最好的select:

附录:

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

您可以简单地使用提供同步function的节点模块。 在这里你会发现一个提供同步/asynchronous函数来处理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)) ; 

对于我在node.js中编码的大部分内容,我喜欢asynchronous代码。 但是,我完全明白,asynchronous代码与编写和维护业务逻辑的需求是极其危险的。 我已经使用了各种替代方法。 使事物同步的模块仍然给你带来复杂化的数据范围问题。 承诺为我工作最好。 使用这种方法,我发现自己实际上正在为JavaScript编写一种新语言的解释器。 我可能看起来很荒唐,但对我来说最实用和最安全的方法是使用shelljs模块和mysql shell客户端。 这不是很好的执行性能,但它使开发人员的性能更好,并保持业务逻辑清晰有序,这对业务逻辑至关重要。 下面的代码片段给出了我创build的一些示例:

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; },