查询后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();