我一直在努力让MySQL在节点上工作一段时间。当我运行以下代码时,不会抛出任何错误,但同时没有打印任何控制台消息(除了显而易见的消息)。
var app = require('express')();
var http = require('http').Server(app);
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '******',
database : 'blogDB'
});
connection.connect(function(err) {
if(err) {
console.log('error when connecting to database:', err);
}
console.log('Connected to the database');
});
var queryString = 'SELECT * FROM blogs';
connection.query(queryString, function(err, rows, fields) {
if (err) throw err;
for (var i in rows) {
console.log('Post: ', rows[i].id);
}
});
connection.end();
http.listen(3306, function(){
console.log('listening on *:3306');
});
输出:收听*:3306
除此之外,当我在浏览器中转到“localhost:3306”时,会立即开始下载并且网页上不会显示任何内容。下载是没有扩展名的文件,但包含以下内容:
J
5.6.19 tscvKP3M ÿ÷ € g?F!q6X:Y2*z mysql_native_password ! ÿ„#08S01Got packets out of order
我不确定这是否相关,但当我没有运行MySQL时肯定没有发生。我不知道如何解决这个问题。什么可能出错的想法?
答案 0 :(得分:1)
这里的错误是你将node.js编码,好像它是程序性的。不是。
connection.connect(function(err) {
if(err) {
console.log('error when connecting to database:', err);
}
console.log('Connected to the database');
var queryString = 'SELECT * FROM blogs';
//change from connection to "this" because you're inside the context of the connection object now
this.query(queryString, function(err, rows, fields) {
if (err) throw err;
for (var i in rows) {
console.log('Post Titles: ', rows[i].id);
}
});
});
Node.js使用一系列在任务完成时运行的回调。因此,当您想要在连接到数据库之后执行某些操作时,可以在回调中运行该代码。
您的代码正在尝试连接到数据库,然后在尝试连接到数据库时,您要查询未连接的数据库,依此类推等等。
为了更多地说明原理,节点函数使用以下一般方法。
//1
myObj.myFunc( function( err , foo , bar ) {
//A
});
//2
myObj.myOtherFunc( function( err , someVar ) {
//B
});
1将始终在2.之前运行.A和B可以按任意顺序运行,具体取决于1和2何时完成执行。 A总是在1完成后运行。 B将在2完成后继续运行。
希望这有助于清理事情;)
答案 1 :(得分:0)
事实证明,MySQL和应用程序使用相同的端口运行(3306)。将应用程序的端口更改为3307就可以了。