查询后Node.js mysql db连接

我正在尝试在node.js中编写一个数据库pipe理器模块,用于我将在服务器应用程序中使用的一些常见查询。 我想testing模块。 但是,在执行查询之前,我的代码没有连接到数据库。 我怎么能这样安排我的代码,它连接到数据库之前的查询,而不是他们之后?

码:

var mysql = require('mysql'); var conn = mysql.createConnection( { host: 'localhost', user: 'root', password: 'password', database: 'mydb' }); conn.connect(function(error) { if ( error) throw error; console.log('->connected to database'); }); // user as json getUserData = function(username) { conn.query('SELECT * FROM USERS WHERE USERNAME = \"' + username + '\"' , function (error, result, fields) { if (error) throw error; return result; }); } console.log('result->' + JSON.stringify(getUserData('eness'))); conn.end(); 

输出:

 result->undefined ->connected to database 

你的getUserData()没有任何返回。 从查询的callback函数返回result不会使其成为getUserData()的返回值,因为callback是asynchronous执行的。

您不能从同步函数内的asynchronous函数调用返回。

如果您将console.log()行移入callback,您将看到正确的输出:

 getUserData = function(username) { conn.query('SELECT * FROM USERS WHERE USERNAME = \"' + username + '\"' , function (error, result, fields) { if (error) throw error; console.log('result->' + JSON.stringify(result)); }); } getUserData('eness'); conn.end(); 

如果您不想将逻辑放在查询的callback(单独的查询和业务逻辑)中:

 getUserData = function(username, cb) { conn.query('SELECT * FROM USERS WHERE USERNAME = \"' + username + '\"' , function (error, result, fields) { if (error) throw error; cb(result) }); } getUserData('eness', function(result) { console.log('result->' + JSON.stringify(result)); }); conn.end(); 

欢迎来到回拨地狱 :)现在考虑使用Promise 。

发生这种情况是因为node.js的asynchronous性质, conn.connect之后的代码不会等待该连接完成来执行getUserData ,因此getUserData操作不会等待连接发生,有这个错误。 尝试以下解决方法仅用于testing目的。 如果你使用连接到REST端点的getUserData函数,这将不会发生,因为连接发生在nodejs应用程序启动时。

 conn.connect(function(error) { if ( error) throw error; else console.log('result->' + JSON.stringify(getUserData('eness'))); console.log('->connected to database'); }); function getUserData(username) { conn.query('SELECT * FROM USERS WHERE USERNAME = \"' + username + '\"' , function (error, result, fields) { if (error) throw error; return result; }); } conn.end();